|
Boost : |
From: Eric Ford (eford_at_[hidden])
Date: 2001-03-18 03:54:31
I'm using the counted_ptr from http://ootips.org/yonat/4dev/ which is
similar to boost's shared_ptr. However, I've run into a problem. I'm
willing to switch to the boost smart pointers, if they offer a
solution
to my problem. (But I'm guessing that a solution for one would work
for
the other.) Any help with either would be appreciated...
I have an STL container of counted_ptr<A>'s. At some point I need to
do a dynamic downcast of a counted_ptr<A> to a counted_ptr<B>. How do
I do that?
The code is something like the following...
class A
{
public:
virtual int f() = 0;
...
};
class B : public A
{
public:
virtual int f() = 0;
virtual int g() { return -1; };
};
class C : public B
{
public:
virtual int f() { return 1; };
...
};
class D : public B
{
public:
virtual int f() { return 2; };
...
};
If I do...
counted_ptr<A> cpA = input from somewhere
A* pA = cpA.get();
B* pB = dynamic_cast<A*>(pA);
if(pB==NULL) throw("Illegal down cast!");
counted_ptr<B> cpB = counted_ptr<B>(pB);
...then the counter will get messed up and my cpA could get deleted
when the counter of cpB's gos to zero, even if the counter of cpA is
>0.
If I were using regular pointers (and non-STL contains), I could just
do...
A* pA = input from somewhere
B* pB = dynamic_cast<A*>(pA);
if(pB==NULL) throw("Illegal down cast!");
If I were using counted_ptr's, but B wasn't virtual, then I could
do...
counted_ptr<A> cpA = input from somewhere
A* pA = cpA.get();
B* pB = dynamic_cast<A*>(pA);
if(pB==NULL) throw("Illegal down cast!");
B* pBn = new B(*pB);
counted_ptr<B> cpB = counted_ptr<B>(pBn);
...but I can't allocate a new B object, since B's virtual. I suppose
I could make a switch statement to test of each of C and D, although
in my real code, that would result in a very large switch statement
and make a pain for adding new classes. But I'm hoping you have a
better suggestion (aside from avoiding dynamic downcasts).
Thanks,
Eric
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk