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