On Mon, 13 Oct 2003, Edmond Offermann wrote: Hi Edmond, > Hi Gero, > > I am confused. The code (ok it is a few > clicks down the road) of IndexOf() shows that > it uses IsEqual(). The documentation of IsEqual() > says: > > "Default equal comparison (objects are equal if > they have the same address in memory). > More complicated classes might want to override this > function." > > So the default behavior is compare address in > memory ! Then YOU overwrite the default with > > virtual Bool_t IsEqual(const TObject* obj) const{ > return (obj && fName ==TString(obj->GetName())); > > and are surprised that it does not compare > the addresses anymore ?? > > Your macro just does what it is supposed to do. > Yes, looking at the code I totally understand what is going on, but from the name of the method and its description I got another impression, so its fine with me that Fons makes the documentation more explicit. > Having the Remove() remove all occurences would > be a mistake too : what if I just want to remove > one of them. > > If you want to get them all, just do > while (mybla->Remove(obj)) > Nice idea. Cheers Gero > Eddy > --- Gero Flucke <gero.flucke@desy.de> wrote: > > Hi Rooters! > > I wonder about the behaviour of > > TObjArray::Remove(TObject* obj): > > > > 1. > > As it uses TObjArray::IndexOf(obj) it does not > > remove objects with address > > equal to obj, but the first object that answers > > kTRUE on IsEqual(obj). But > > this is what I expect from a method 'Remove' with a > > pointer as argument. > > At least the html documentation should mention that! > > A macro showing the removal of the - for my > > expectation - wrong object > > canbe found at the end. > > > > > > 2. > > One may also expect that all objects equal to 'obj' > > are removed from the > > array, not only the first that matches. Here I > > admit that this is a > > matter of taste, but at least it should be > > documented in html. > > > > Cheers > > > > Gero Flucke > > > > PS: (ROOT 3.04_02 on desy-linux4 (suse based)) > > > > PSS: Here comes the macro > > > > > > > > #include "TNamed.h" > > #include "TObjArray.h" > > #include <iostream> > > > > class MyNamed : public TNamed{ > > public: > > MyNamed(const char* name) : TNamed(name, name){} > > virtual Bool_t IsEqual(const TObject* obj) const{ > > return (obj && fName == > > TString(obj->GetName())); > > } > > virtual void Print(Option_t* opt) const{ > > this->TNamed::Print(); > > cout << this << endl; > > } > > ClassDef(MyNamed,1) > > }; > > > > void macro() > > { > > MyNamed* mn1 = new MyNamed("nam1"); > > cout << mn1 << endl; > > MyNamed* mn2 = new MyNamed("nam2"); > > cout << mn2 << endl; > > MyNamed* mn3 = new MyNamed("nam1"); // again name > > as mn1 > > cout << mn3 << endl; > > > > TObjArray* arr = new TObjArray; > > arr->Add(mn3); > > arr->Add(mn1); > > arr->Add(mn2); > > arr->Print(); > > > > cout << "\n Now removing " << mn1 << "..." << > > endl; > > > > arr->Remove(mn1); > > arr->Print(); > > > > } > > > > giving : > > > > root [0] .x macro.C++ > > Info in <TUnixSystem::ACLiC>: creating shared > > library > > > /afs/desy.de/user/f/flucke/h1/oo/calib/GFCalib/./macro_C.so > > 0x88d4868 > > 0x88d6370 > > 0x88d63c0 > > OBJ: MyNamed nam1 nam1 > > 0x88d63c0 > > OBJ: MyNamed nam1 nam1 > > 0x88d4868 > > OBJ: MyNamed nam2 nam2 > > 0x88d6370 > > > > Now removing 0x88d4868... > > OBJ: MyNamed nam1 nam1 > > 0x88d4868 > > OBJ: MyNamed nam2 nam2 > > 0x88d6370 > > > > > > > > > > > > > > > > > > > > > > > ----------------------------------------------------------------------- > > Gero Flucke > > 1a / 603 > > DESY > > Notkestr. 85 > > 22607 Hamburg > > +49-(0)40-8998-2454 > ----------------------------------------------------------------------- Gero Flucke 1a / 603 DESY Notkestr. 85 22607 Hamburg +49-(0)40-8998-2454 Privat / private: ----------------- Von-Hutten-Str. 20 22761 Hamburg
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET