Newsgroup: it.comp.lang.c++
Titolo: [Volatili per diabetici] problemi nell'ereditare una classe template

Ciao a tutti
ho scritto questa classe template stupida:
----------------------------------
template<class Elem, class Chiave> class Nodo {
  //per fare l'output facile facile
    friend ostream &operator<< ( ostream &os, Nodo< Elem, Chiave > *node )
    {
        cout << "in ostream : key=" << node->key << endl;
        return os << "( " << node->getElement()
                  << " - " <<  node->getKey() << " )";
    }
  public:
     //costruttore di default
     Nodo () { };
     // Costruttore. crea un nodo prendendo in ingresso la coppia element - 
key
     Nodo ( Elem elm, Chiave chiav ) {
         // assegna l'elemento al nodo...
         element = elm ;
         // ...e assegna la chiave al nodo.
         key = chiav;
         cout << "in Nodo(...)        : " << this << endl;
         };
     // Ritorna l'elemento;
     const Elem getElement () { return element; };
     // Ritorna la chiave
     const Chiave getKey () { return key; };
  private:
     //puntatore all'elemento
     Elem element;
     //puntatore alla chiave
     Chiave key;
};
----------------------------------------
l'ho testata e funge bene...
poi ho creato questa classe che eredita la prima come public:
----------------------------------------
template<class Elem, class Chiave> class NodoBinario: public 
Nodo<Elem,Chiave> {
    public:
        // costruttore: prende l'elemento, la chiave, e il padre.
        // quest'ultimo può essere omesso ( ad es se il nodo è radice ).
        NodoBinario ( Elem elm, Chiave chiav, NodoBinario* babbo );
    // blablablabla ...
};
template<class Elem, class Chiave>
NodoBinario<Elem,Chiave>::NodoBinario( Elem elm, Chiave chiav, 
NodoBinario<Elem,Chiave> *babbo ) {
      //invoca il costruttore padre
      Nodo<Elem,Chiave> ( elm, chiav );
      //imposta il padre
      anchestor = babbo;
      //setta i figli a NULL
      l_son = r_son = NULL;
      cout << "excape from constr..." << endl;
}
-------------------------------------------------------------
ed ho testato la classe con un paio di instanze: un bagno di sangue...
il fatto è che gli attributi template quando sono ereditati perdono di 
significato:
cioè, ad esempio, se creo un oggetto della secona classe con questa 
sintassi:
NodoBinario<int,int> *n1 = new NodoBinario<int,int> ( 3, 1, NULL );
fin quando il flusso del programma è nel costruttore padre va tutto ok e se 
gli faccio stampare se stesso fa:
"( 3 - 1 )"
nonappena, però, esce dal costruttore padre, mi scazza di brutto,come se 
dimenticasse il tipo del template in uso ( ad es <int,int> o che ne so 
io... )
infatti se gli faccio stampare il valore della chiave stampa valori assurdi 
tipo: key=3998840; mentre un'attimo prima è 1, ho poi notato che se stampo 
l'elemento, questo ha sempre lo stesso valore della chiave, per ogni oggetto 
creato... ( come se stampasse un valore di un puntatore castato a 
intero )...
che impiccio ho fatto?
Aiutatemi plz... io di c++ non ne capisco nulla... l'ho studiato taaanto 
tempo fa... e poi non l'ho mai usato... ho sempre javato, xml-ato e giocato 
col pongo...
il prof s'è inventato di usare il c++, che è bello, ma se non lo mastichi 
non te lo impari, puoi avere fatto tutti gli esami di programmazione ad obj 
che ti pare...
grazie
Daniele
-- 
--------------------------------------
http://gnaskuru.altervista.org
the 
Gn.AS.ku.RU
. project HOME
-------------------------------------- 

 -------------------------------------------------------------
ad occhio sbagli il costruttore
 template<class Elem, class Chiave>
 NodoBinario<Elem,Chiave>::NodoBinario( Elem elm, Chiave chiav,
 NodoBinario<Elem,Chiave> *babbo ) :    Nodo<Elem,Chiave> ( elm, chiav ), 
anchestor(babbo),
    l_son(0), r_son(0)
{
      cout << "excape from constr..." << endl;
}
l'errore è solo in Nodo, gli altri elementi è preferibile inizializzarli in 
questo modo 

si, era il costruttore...
c'ho pensato ieri, anzi stamattina alle 5 mentre andavo a nanna...
grazie, anche x l'altro 3d sull'overload,
ho inserito il reference ma non sò perchè se uso il const il compilatore si 
lamenta...
eppure chiamo solo metodi const...
boh! cmq almeno ora ha il reference!
ciao,
Daniele