Two parent classes each with boost::enable_shared_from_this
{ Note: multi-posted to [comp.lang.c++]. -mod/aps }
How to solve following problem:
I have two base classes A1 and A2, each must be able to return this as a
shared_ptr - it have a boost::enable_shared_from_this
Next they have a son B and its son C.
In C I want to get this as shared_ptr<A1> (and later dynami cast it into
C and use it) and also I want to be able to get this in form of
shared_ptr<C> (well - same thing as previous with casting)
A1 A2 - two parents, they must have enable_shared_from_this
| |
| |
\ /
B - B class
|
C - C class
now in C I need to get pointer to this as shared_ptr<A1>
and later I need to dynamic cast it into shared_ptr<C>
I tried several times with but the code doesnt work.
Two examples with resuls below
============================================================
One of the attempts, introducing additional base class which is base of
A1 and A2.
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
using namespace std;
using namespace boost;
struct cWithSharedThis : enable_shared_from_this<cWithSharedThis> {
cWithSharedThis() {
cout << "cWithSharedThis() " << (void*)this << endl;
}
};
struct cA1 : public virtual cWithSharedThis {
string name;
cA1(string n) : name(n) {
cout << "cA1 I am this " << (void*)this << endl;
}
virtual ~cA1() {}
virtual void Hello() { cout<<"I am " << name << " type " << Type()
<< endl; }
virtual string Type() { return "cA1"; }
virtual void foo() { cout<<"Foo 1 nothing"<<endl; }
} ;
struct cA2 : public virtual cWithSharedThis {
string name;
cA2(string n) : name(n) {
cout << "cA2 I am this " << (void*)this << endl;
}
virtual ~cA2() {}
virtual void Hello() { cout<<"I am " << name << " type " << Type()
<< endl; }
virtual string Type() { return "cA2"; }
virtual void foo() { cout<<"Foo 2 nothing"<<endl; }
} ;
struct cB : public cA1, public cA2 {
cB(string n):cA1(n+"1"),cA2(n+"2"){
cout << "cB I am this " << (void*)this << endl;
}
virtual string Type() { return "cB"; }
};
struct cC : public cB {
cC(string n):cB(n) {
cout << "cC I am this " << (void*)this << endl;
}
virtual string Type() { return "cC"; }
virtual void foo() {
cout << "foo() I am this " << (void*)this << endl;
shared_ptr<cWithSharedThis> ptr_base_this =
cA1::shared_from_this(); // <------
if (!ptr_base_this) { cout << "ptr_base_this is NULL! " << endl
<< flush; return; }
cout << "We got ptr_base_this in " << (void*)ptr_base_this.get()
<< endl << flush;
shared_ptr<cA1> ptr = dynamic_pointer_cast<cA1>(ptr);
cout << "We got ptr in " << (void*)ptr.get() << endl << flush;
if (!ptr) { cout << "ptr is NULL! " << endl << flush; return; }
ptr->Hello();
}
};
int main() {
shared_ptr<cC> c( new cC("xxx") );
c->foo();
}
g++ x.cpp -o x.elf -g3 -O0 -Wall
../x.elf
cWithSharedThis() 0x804c308
cA1 I am this 0x804c2f8
cA2 I am this 0x804c300
cB I am this 0x804c2f8
cC I am this 0x804c2f8
foo() I am this 0x804c2f8
We got ptr_base_this in 0x804c308
make: *** [run] Segmentation fault
============================================================
second example
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
using namespace std;
using namespace boost;
struct cA1 : enable_shared_from_this<cA1> {
string name;
cA1(string n) : name(n) {}
virtual ~cA1() {}
virtual void Hello() { cout<<"I am " << name << " type " << Type()
<< endl; }
virtual string Type() { return "cA1"; }
virtual void foo() { cout<<"Foo 1 nothing"<<endl; }
} ;
struct cA2 : enable_shared_from_this<cA2> {
string name;
cA2(string n) : name(n) {}
virtual ~cA2() {}
virtual void Hello() { cout<<"I am " << name << " type " << Type()
<< endl; }
virtual string Type() { return "cA2"; }
virtual void foo() { cout<<"Foo 2 nothing"<<endl; }
} ;
struct cB : public cA1, public cA2 {
cB(string n):cA1(n+"1"),cA2(n+"2"){}
virtual string Type() { return "cB"; }
};
struct cC : public cB {
cC(string n):cB(n) {}
virtual string Type() { return "cC"; }
virtual void foo() {
shared_ptr<cA1> ptr = cA1::shared_from_this(); // <------
ptr->Hello();
}
};
int main() {
shared_ptr<cC> c( new cC("xxx") );
c->foo();
}
terminate called after throwing an instance of 'boost::bad_weak_ptr'
what(): boost::bad_weak_ptr
Aborted
--
LimCore
---> oo
Linux, Windows; Wysokopoziomowe C++, std, boost
http://www.limcore.pl - w przygotowaniu
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]