Should there be a check to insure that parent is not a child of this? Perhaps something like: TNode *pp = parent; while(pp) { if (pp == this) { printf("Error: Cannot set parent node to be a child node.\n"); printf(" Operation not performed!\n"); return; } pp = pp->GetParent(); } Glen On 29-Aug-2001 Rene Brun wrote: > Hi Robert, > > Your analysis is correct. TNode::SetParent was not doing the complete > job. > Your fix is OK. I introduced it into the current CVS head. > Thanks for this report. > > Rene Brun > > Robert Hatcher wrote: >> >> Hi, >> Currently in TNode.h there is the declaration & definition for the >> method to change a TNode's parent, e.g.: >> >> virtual void SetParent(TNode *parent) {fParent=parent;} >> >> But this does only half the work necessary. The parent losing the >> custody battle is never informed and continues to think they have >> this child. I think the right code is: >> >> void TNode::SetParent(TNode *parent) >> { >> // set the pointer to the parent, keep parents informed about who >> they have >> >> if (fParent) fParent->GetListOfNodes()->Remove(this); >> else gGeometry->GetListOfNodes()->Remove(this); >> >> fParent = parent; >> >> if (fParent) { >> fParent->BuildListOfNodes(); // new parent might not have list >> fParent->GetListOfNodes()->Add(this); >> } >> else gGeometry->GetListOfNodes()->Add(this); >> } >> >> Could this be the distributed definition? There are times when >> building a geometry it's easier to build a "containee" node before >> one builds the "container" node and then after the fact make >> the right adjustments. >> >> Thanks, >> -robert >> >> Robert W. Hatcher | rhatcher@slac.stanford.edu >> Research Associate | 650.926.3171 [FAX 4001 or 3587] >> Stanford University | PO Box 4349, MS #63, Stanford CA 94309
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:59 MET