Hi Rooters, I plan to store a set of classes with pointers between them. As a first exercise I've just taken 2 classes, one having a pointer to the other. I just want to store everything in a TTree, with the second class being a sub-branch of the first one. The problem I have is that the pointer seems not to be followed by the streamer. I can't figure out where is the problem. If I replace the pointer by a simple member, everything woks then. I've included the code of my test program, as well as the linkdef file and the sequence I performed to compile it. Can anybody tell me what I'm doing wrong ? Thanks in advance, Christophe. /******************************************************** * BankClasses.h *******************************************************/ #ifndef _ALPHACLASSES_H_ #define _ALPHACLASSES_H_ #include <TObject.h> class RLEP : public TObject { public: virtual ~RLEP(); int LE; int LF; ClassDef(RLEP,1) //LEP information }; class QEXT : public TObject { public: virtual ~QEXT(); RLEP* LP; int bb; ClassDef(QEXT,1) //external information access point }; #endif /******************************************************** * BankClasses.cpp *******************************************************/ #include "BankClasses.h" ClassImp(RLEP) RLEP::~RLEP(){} ClassImp(QEXT) QEXT::~QEXT(){} /************************************************************ * Test main file ***********************************************************/ #include <iostream> #include "TFile.h" #include "TTree.h" #include "BankClasses.h" int main() { cout << "starting" << endl; TFile f("alephtree.root","RECREATE"); TTree t("altree","a test ALEPH tree"); QEXT* mqext = new QEXT; RLEP* mrlep = new RLEP; mqext->bb = 45; mrlep->LE = 206; mrlep->LF = 123; mqext->LP = mrlep; t.Branch("external_bank","QEXT", &mqext); cout << "start filling" << endl; t.Fill(); cout << "done. Writing" << endl; f.Write(); cout << "printing" << endl; t.Print(); cout << "closing" << endl; f.Close(); cout << "test: " << mqext->bb << endl; cout << "test: " << mqext->LP->LE << endl; cout << "deleting object" << endl; delete mqext; delete mrlep; return 0; } /**************************************************************** * BanksLinkDef.h ***************************************************************/ #ifdef __CINT__ #pragma link off all globals; #pragma link off all classes; #pragma link off all functions; #pragma link C++ class RLEP+; #pragma link C++ class QEXT+; #endif /**************************************************************** * "makefile" ***************************************************************/ #!/bin/sh rootcint -f BankClassesDict.cpp -c BankClasses.h BanksLinkDef.h g++ -O -Wall -fPIC -I/usr/include/root -c BankClasses.cpp g++ -O -Wall -fPIC -I/usr/include/root -c BankClassesDict.cpp g++ -O -Wall -fPIC -I/usr/include/root -c main.cpp g++ -shared -O BankClasses.o BankClassesDict.o -o libBankClasses.so g++ -O main.o libBankClasses.so -L/usr/lib/root -lCore -lCint -lTree -lRint -lg++ -lm -ldl -rdynamic -o test -- +-----------------------------------------------------------\|/---+ | Christophe DELAERE office: e253 !o o! | | UCL - FYNU phone : 32-(0)10-473234 ! i ! | | chemin du cyclotron, 2 fax : 32-(0)10-452183 `-' | | 1348 Louvain-la-Neuve BELGIUM e-mail: delaere@fynu.ucl.ac.be | +-----------------------------------------------------------------+
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:03 MET