Hi Alexis, Unfortunately, you do not indicate which version of Root and OS. I cannot reproduce your problem. Using your .H and .C files, I have created a shared lib mignon.so, then run the following session: root [0] .L mignon.so root [1] TestClass* c=new TestClass; root [2] c->Add("first"); root [3] c->Add("second"); root [4] c->Add("third"); root [5] c.ls() OBJ: TestClass TestClass test class : 0 at: 0x899c098 root [6] TestClass* c2=(TestClass*)c->Clone(); root [7] c2.ls() OBJ: TestClass TestClass test class : 0 at: 0x89a37d0 root [8] TestClass2* c3=(TestClass2*)c2->GetList()->First(); root [9] c3 (class TestClass2*)0x89d2368 root [10] c3.ls() OBJ: TestClass2 first testclass2 : 0 at: 0x89d2368 root [11] c3->GetParent() (class TestClass*)0x899c098 root [12] c (class TestClass*)0x899c098 AS you can see, results seem to be correct. Rene Brun Mignon Alexis wrote: > > Hello, > > I have a problem with some circular refernces when i try to make a > clone of an object. > > i have for instance 2 objects : > > /////////////////// TestClass.H /////////////////////// > > #ifndef __TestClass__ > #define __TestClass__ > > #include <TList.h> > #include "TestClass2.H" > class TestClass2; > class TestClass : public TObject { > protected : > TList *fList; // -> list > > public : > TestClass(); > ~TestClass(); > > TestClass2* Add(const Char_t *name); > TList* GetList() const; > ClassDef(TestClass,1) //test class > }; > > inline TList*TestClass::GetList() const{ > return fList; > } > > #endif > \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ > and > /////////////// TestClass2.H /////////////////////////// > #ifndef __TestClass2__ > #define __TestClass2__ > > #include <TNamed.h> > #include <TRef.h> > #include "TestClass.H" > > class TestClass; > class TestClass2 : public TNamed{ > protected: > TRef fClassTest; // back reference > > public: > TestClass2(); > TestClass2(const Char_t* name, TestClass* tc); > ~TestClass2(); > > TestClass* GetParent(); > void SetParent(TestClass*c); > > ClassDef(TestClass2,1) //test class 2 > > }; > > inline TestClass* TestClass2::GetParent(){ > return (TestClass*)fClassTest.GetObject(); > } > > #endif > > \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ > > with the default streamer when i do > > TestClass* c=new TestClass; > c->Add("first"); > c->Add("second"); > c->Add("third"); > > TestClass* c2=(TestClass*)c->Clone(); > > TestClass2* c3=(TestClass2*)c2->GetList()->First(); > > then > c3->GetParent() returns the null pointer (why not the pointer to c ?) > > to set the parent member of TestClass2 > > i've modified the streamer of TestClass so that it does a > class2->SetParent(this) for each object in its list. > > but then > > c3->GetParent() returns the pointer to c instead of c2 . > > What must i do in order to get the good parent pointer to the clone of > the first object > > this is the source code for the 2 classes : > > ////////////////////////// TestClass.C //////////////////////////// > > #include "TestClass.H" > #include <TCollection.h> > > ClassImp(TestClass); > > TestClass::TestClass(){ > fList=0; > } > > TestClass::~TestClass(){ > if(fList) { > fList->Delete(); > delete fList; > } > } > > TestClass2* TestClass::Add(const Char_t*name){ > if (!fList) fList=new TList; > TestClass2*c=new TestClass2(name, this); > fList->Add(c); > return c; > } > void TestClass::Streamer(TBuffer &R__b) > { > // Stream an object of class TestClass. > > UInt_t R__s, R__c; > if (R__b.IsReading()) { > Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { } > TObject::Streamer(R__b); > R__b >> fList; > TIter next(fList); > TestClass2*c2; > while( (c2=(TestClass2*)next()) ){ > c2->SetParent(this); > } > R__b.CheckByteCount(R__s, R__c, TestClass::IsA()); > } else { > R__c = R__b.WriteVersion(TestClass::IsA(), kTRUE); > TObject::Streamer(R__b); > R__b << fList; > R__b.SetByteCount(R__c, kTRUE); > } > } > > \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ > > and > > ////////////////////////// TestClass2.C //////////////////////////// > #include "TestClass2.H" > > ClassImp(TestClass2); > > TestClass2::TestClass2(){ > fClassTest=0; > } > > TestClass2::TestClass2(const Char_t *name, TestClass* tc) > : TNamed(name,"testclass2"){ > > fClassTest=tc; > } > > TestClass2::~TestClass2(){ > } > > void TestClass2::SetParent(TestClass *c){ > fClassTest=c; > } > \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ > -- > Alexis Mignon > GANIL > Bd Henri Becqurel > 14076 CAEN Cedex 5 > France > tel: +(33) (0)231454680 > e-mail : mignon@ganil.fr
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:11 MET