Re: [ROOT] how to know what is the class of the object calling a member function of another class

From: Frankland John (frankland@ganil.fr)
Date: Sat Nov 01 2003 - 08:32:49 MET


Hi Christian

Thanks a lot for this fascinating reply, I actually ended up doing 
something similar
to your last suggestion, i.e. put a flag in one of the objects, tested 
by the other object's
dtor, in order to avoid a recursive nightmare:

void KVTelescope::RemoveDetector(KVDetector* det, Bool_t 
kDeleteDetector, Bool_t kDeleteEmptyTelescope)
{
    //Remove detector from the telescope's list and delete the detector
    //(if kDeleteDetector=kTRUE : default).
    //A check is made if the detector belongs to the telescope.
    //If kDeleteDetector=kFALSE detector is not deleted.
    //If there are no more detectors after this, delete the telescope
    //(unless kDeleteEmptyTelescope=kFALSE).

    if(fDetectors){
        if( fDetectors->FindObject(det) ){
            fDetectors->Remove(det);
            SetBit(kIsRemoving);//////set flag tested in 
KVDetector::~KVDetector
            if(kDeleteDetector) delete det;
            ResetBit(kIsRemoving);//unset flag tested in 
KVDetector::~KVDetector
        }
        //destroy this telescope if there are no detectors left in it
        if( fDetectors->GetSize() == 0 && kDeleteEmptyTelescope ) Delete();
    }
}

and

KVDetector::~KVDetector()
{
    //remove from telescope's list of detectors, if in a telescope
    //warning: this dtor can be called by KVTelescope::RemoveDetector 
itself,
    //in this case we don't want to disappear up our own existence...
    if(GetTelescope()) {
        if(!GetTelescope()->IsRemoving()) 
GetTelescope()->RemoveDetector(this, kFALSE);
    }
 }

which works quite nicely.
Cheers
John

>I think this is sort of contrary to the collection design in ROOT.
>Perhaps you'd be better of setting a flag in the object you may have
>added to a container: 
>
>  SomeClass c;
>  TList     l;
>  l.Add(&c);
>  c.SetInContainer(kTRUE);
>
>  SomeClass::~SomeClass() 
>  { 
>    if (IsInContainer()) 
>      ...
>  }
>
>Hmm.  Perhaps some sort of smart pointer with policies usage in the
>collection classes would be a good idea.  I believe that in the
>up-coming C++ 0x standard, the SmartPtr of [3] will be incorporated in
>the Standard Library. 
>
>Yours, 
>
> ___  |  Christian Holm Christensen 
>  |_| |	 -------------------------------------------------------------
>    | |	 Address: Sankt Hansgade 23, 1. th.  Phone:  (+45) 35 35 96 91
>     _|	          DK-2200 Copenhagen N       Cell:   (+45) 24 61 85 91
>    _|	          Denmark                    Office: (+45) 353  25 404
> ____|	 Email:   cholm@nbi.dk               Web:    www.nbi.dk/~cholm
> | |
>
>[1] http://patterndigest.com/patterns/Visitor.html
>[2] http://www.hillside.net/patterns/
>[3] http://www.moderncppdesign.com/
>
>  
>

-- 
John D. Frankland <mailto:frankland@ganil.fr>
Beam Coordinator
GANIL
B.P. 55027
14076 CAEN Cedex 05

*tel:* +33 (0)231454628
*fax:* +33 (0)231454665



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET