Hi Christian,
My guess is that in the default constructor for your BaseClass
(I hope your class is not called TBaseClass!) you set fContent
to a non null value.
The default constructor is called by ROOT I/O to create a dummy
instance of your class to build the class dictionary or stream in
an object from the file.
I suggest you add print statements in your BaseClass
constructor/destructor to see what is happening.
In your default constructor, you can test the return value
of Bool_t TClass::IsCallingNew() to find out if your constructor
is called by you or by ROOT I/O.
Rene Brun
On Sun, 18 Aug 2002, cstrato wrote:
> Dear Rooters
>
> I have a strange problem in a pretty complex program, where
> I store TTrees in a TFile in one root session, but am also
> able to add, delete or update trees in the next session.
> The important classes compiled as library are:
> class TContent: public TList {}
>
> class TBaseClass: public TNamed {
> void AddTree();
> void UpdateTree();
> void DeleteTree();
> }
>
> class DerivedClass: public TBaseClass {}
>
> class MyClass: public TNamed {
> TFile *fFile;
> TContent *fContent;
>
> void AddData() {derivedClass->AddTree();}
> void UpdateData() {derivedClass->UpdateTree();}
> void DeleteData() {derivedClass->DeleteTree();}
> }
>
> First root session:
> In a macro I call myClass->AddData(tree1). A tree is created in
> fFile, and derivedClass1 is stored in fContent.
> Assume that I have created three trees in this way, tree1, tree2
> and tree3. When I call TBrowser, everything is perfectly ok.
>
> Second root session:
> In a macro I call:
> myClass->AddData(tree4)
> myClass->DeleteData(tree1)
> myClass->DeleteData(tree2)
> myClass->AddData(tree5)
> When I open fFile with TBrowser, tree4 and tree5 are added, and
> their corresponding derivedClass4 and derivedClass5 is added to
> fContent, while tree1 and tree2 are deleted and their corresponding
> derivedClass1 and derivedClass2 are deleted from fContent, as
> expected. So far everything is ok.
> But now fFile contains suddenly the three derivedClass1,2,3 from
> the first root session as single objects in fFile. Apparently,
> the old content of fContent is read and stored in fFile.
> I do not understand, why these objects are suddenly stored in
> fFile, since I never call fFile->Write() but only obj->Write().
>
> The destructor of BaseClass looks as follows:
> BaseClass::~BaseClass
> {
> if (fFile) {
> // Write content to file only if new file or file is updated
> fFile->cd();
> if (fContent && (strcmp(fFile->GetOption(), "READ") != 0)) {
> // kSingleKey since fContent is a TCollection!!
> fContent->Write("", TObject::kSingleKey | TObject::kOverwrite);
> }//if
>
> fContent->Delete();
> SafeDelete(fContent);
> SafeDelete(fFile);
> }//if
>
> // fTrash->Delete();
> SafeDelete(fTrash);
> }
>
> My questions are:
> Can anybody give me a hint why the objects are written to fFile?
> How can I prevent that the old list content is written to fFile?
>
> Thank you in advance for your help.
>
> Best regards
> Christian
> _._._._._._._._._._._._._._._._
> C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a
> V.i.e.n.n.a A.u.s.t.r.i.a
> _._._._._._._._._._._._._._._._
>
>
>
>
>
>
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:04 MET