Re: [ROOT] TObjArray::Remove

From: Gero Flucke (gero.flucke@desy.de)
Date: Tue Oct 14 2003 - 10:59:48 MEST


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