Re: [ROOT] To create sortable objects and add them to a TSortedList

From: Sebastien Greder (greder@in2p3.fr)
Date: Mon Nov 17 2003 - 13:37:51 MET


  Hi Jose,

  you didn't override your Compare function correctly, it should
  be :

  Int_t Compare(const TObject *obj) const
    {
       if ( i <  ((MyClass*)obj)->i ) return -1;
       if ( i == ((MyClass*)obj)->i ) return 0;
       if ( i >  ((MyClass*)obj)->i ) return 1;
    }  

  moreover it should have a default return value
 
  I get :

  root [0] .L test.C+
  Info in <TUnixSystem::ACLiC>: creating shared library /homesf1/greder/./test_C.so
  /homesf1/greder/./test.C: In method `Int_t MyClass::Compare (const TObject *) const':
  /homesf1/greder/./test.C:22: warning: control reaches end of non-void function
  root [1] test()
  2
  4
  6
  root [2]
  
  cheers,

  seb.

On Mon, 17 Nov 2003, Jose Caballero wrote:

> Hello:
> 
> 
> I am trying to create a class and then to add the objects in a 
> TSortedList. My class is:
> 
> *************************************
> 
> class MyClass : public TObject {
> private:
>    Int_t i;
> public:
>    MyClass(int x = 0) : i(x) {}
>    ~MyClass(){}
>    void Set(int x) { i=x; }
>    Int_t Get() const { return i;}
>    Bool_t IsEqual (TObject *obj) const
>    {
>       return i == ((MyClass*)obj)->i;
>    }
>    Int_t Compare(TObject *obj) const
>    {
>       if ( i <  ((MyClass*)obj)->i ) return -1;
>       if ( i == ((MyClass*)obj)->i ) return 0;
>       if ( i >  ((MyClass*)obj)->i ) return 1;
>    }
>    Bool_t IsSortable() const { return kTRUE; }
>    ULong_t Hash() const { return i; }
> 
>    ClassDef(MyClass,1);
> };
> 
> *************************************
> 
> My code is:
> 
>    TSortedList *list = new TSortedList;
>    MyClass *obj1 = new MyClass(4);
>    MyClass *obj2 = new MyClass(2);
>    MyClass *obj3 = new MyClass(6);
>   
>    list->Add(obj1);
>    list->Add(obj2);
>    list->Add(obj3);
> 
>  
>    for ( Int_t i=0; i<3; i++) {   
>       cout << ( (MyClass *)list->At(i) )->Get() << endl;
>    }
> 
> *************************************
> 
> 
> When I compile the program, ROOT returns:
> 
> /root/include/TObject.h:110: warning: `virtual Int_t
>    TObject::Compare(const TObject*) const' was hidden
> MyClass.p.h:14: warning:   by `
>    Int_t MyClass::Compare(TObject*) const'
> /root/include/TObject.h:136: warning: `virtual Bool_t
>    TObject::IsEqual(const TObject*) const' was hidden
> MyClass.h:10: warning:   by `
>    Bool_t MyClass::IsEqual(TObject*) const'
> 
> 
> And when I execute the code, I obtain:
> 
> Warning in <MyClass::Compare>: this method must be overridden!
> Warning in <MyClass::Compare>: this method must be overridden!
> Warning in <MyClass::Compare>: this method must be overridden!
> 4
> 2
> 6
> 
> 
> But I expected
> 2
> 4
> 6
> 
> 
> What am I doing incorrectly?
> What must I do to obtain 2 4 6?
> 
> Thank you very much in advance for your help.
> Best regards. Jose.
> 
> 

------------------------------
 GREDER Sebastien, Doctorant.
 Group D0 IReS.
 IReS, 23 rue du Loess
 67000 STRASBOURG

 mail: greder@in2p3.fr, 
       greder@fnal.gov, 

 tel : (+33) (0)3.88.10.63.54 
-----------------------------



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