Re: dynamic_cast between modules
Re: dynamic_cast between modules
- Subject: Re: dynamic_cast between modules
- From: Steve Baxter <email@hidden>
- Date: Thu, 4 Aug 2005 23:41:04 +0100
Hi Andreas,
Thanks for the comments - the problem is that the modules do not link
to each other, only to the shared framework. It seems that the only
way to solve this is to put the shared class in the shared framework.
Cheers,
Steve.
On 4 Aug 2005, at 16:15, Andreas Grosam wrote:
On 04.08.2005, at 15:09, Steve Baxter wrote:
Hi,
I'm trying to move a large project from Codewarrior to XCode. The
project is broken down into around 50 modules, an application and
a shared framework. The modules and app all link to the framework.
I am having two problems with typeinfo and dynamic_cast:
(1) In Codewarrior it was only necessary to include the header of
a class to be able to use typeinfo or dynaamic_cast on that
class. In XCode I get a link error - "Undefined symbols: typeinfo
for xxxx". This is a pain - there are some circumstances where
modules may pass data to each other through an object database.
We use dynamic_cast to downcast the passed data safely.
If you cross DSO boundaries, for each class respectivley an object
of that class which is an operand for typeid, dynamic_cast or used
as paramter in a catch clause, you need to ensure that the class is
"exported" - so that the RTTI symbols are visible from the other DSO.
There are already several mails in this list how to do this.
(2) I can get around (1) by including the cpp of the object in
*both* modules rather than the "owning" module.
This is a hack.
This enables the modules to link, but now the RTTI information
doesn't match!
I'm unsure whether this is supposed to work!
For instance, ModuleA and ModuleB both implement class Y which is
a subclass of X.
ModuleA makes a Y object and puts it in the database.
ModuleB gets the object Y out of the database - the generic
interface returns an X though, so a downcast is needed to cast X
to Y.
The dynamic_cast fails - it seems that the object Y created by
ModuleA is not considered to be of the same type as an object Y
created by ModuleB.
Maybe because you created to identities of RTTI which are equal,
but not the same. If the implementation of dynamic_cast assumes,
that for each class only one, and only one instance of RTTI exists,
then it might consider that two RTTI objects having different
addresses are not equal. (if so, is this a bug in the compiler??)
Just an idea.
This is a bit of a showstopper for us - we rely on shared objects
like this for our database to work!
Fortunately, you can easily fix this problem - just "export" the
classes in question, means make the RTTI accessible from within
another DSO.
One solution would be to put the implementations of all shared
objects in the shared framework, however this bloats the shared
framework which we are trying to avoid.
That wouldn't work, either.
When you have to call dynamic_cast, typeid or catch() from within
another DSO, you need to export the classes.
Hope this helps.
Andreas
Anyone got any solutions for this? The ideal solution would be a
fix for (1) so that the object code is only in one place.
Cheers,
Steve.
Stephen Baxter
Software Development Manager
Improvision
email@hidden
+44-2476-692229
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
40onlinehome.de
This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
40improvision.com
This email sent to email@hidden
Steve Baxter
Software Development Manager
Improvision
+44-2476-692229
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden