PDA

View Full Version : [C++] >>> Problemi con distruttore template di classe


Urizen
02-01-2006, 11:14
template<class x, class y>
class A{
private:
class B;
class C{
public:
C(B*);
C(const C&);
~C();
C& operator=(const C&);
B& operator*() const;
B* operator->() const;
bool operator==(C) const;
bool operator!=(C) const;
B* puntatore;
};
class B{
public:
B(x, C);
x info;
C next;
list<y>* v;
int rif;
};
C aux;

public:
A();
~A();

};

template <class x, class y>
A<x, y>::A::~A(){ ~aux();};

template <class x, class y>
A<x, y>::A::C::~C()
{if (puntatore)
{puntatore->rif--;
if (puntatore->rif==0)
{delete puntatore;} // delete std di B che richiama ricorsivamente
} // il distruttore di C
};

main(){

A<int, int> primo;

~primo();
}



il mio problema è il distruttore del template di classe A:
quando compilo, mi viene ritornato un errore per il seguente codice:
A<x, y>::A::~A(){ ~aux();};
dicendo:
error: no match for call to '(A<int,int>::C) ()'

in teoria il distruttore del template di classe A mi deve distruggere il suo unico
campo dati (aux) mediante l'istruzione ~aux() usando il distruttore per oggetti
di tipo C che ho definito ... quindi non dovrebbero esserci problemi ... invece ....

chi mi da qualche suggerimento ???
ringrazio in anticipo ...

ilsensine
02-01-2006, 12:31
~primo();

Non credo che se devi chiamare direttamente un distruttore, sia questa la sintassi corretta. In effetti è molto raro dover invocare un distruttore direttamente.

Nel tuo caso non devi richiamare esplicitamente alcun distruttore: "primo" viene distrutto quando perde scopo; aux viene distrutto automaticamente alla distruzione dell'oggetto che lo contiene.

cionci
02-01-2006, 12:34
Non si fanno mai chiamate esplicite al distruttore...se sei obbligato a farla hai un problema di design...

cionci
02-01-2006, 12:38
Comunque se vuoi chiamare il distruttore di aux la sintassi è questa: aux.~C()
Anche per primo la sintaasi dovrebbe essere questa: primo.~A();

ilsensine
02-01-2006, 12:55
Comunque se vuoi chiamare il distruttore di aux la sintassi è questa: aux.~C()
Anche per primo la sintaasi dovrebbe essere questa: primo.~A();
Singolare comunque il messaggio di errore. Stesso errore se chiami l'oggetto come fosse una funzione (ad es. primo(); )

cionci
02-01-2006, 13:04
Singolare comunque il messaggio di errore. Stesso errore se chiami l'oggetto come fosse una funzione (ad es. primo(); )
Infatti lì probabilmente il compilatore ha capito che deve fare la negazione del valore ritornato da primo() ;)

ilsensine
02-01-2006, 13:18
Infatti lì probabilmente il compilatore ha capito che deve fare la negazione del valore ritornato da primo() ;)
e primo() sarebbe...?

cionci
02-01-2006, 13:23
Ho capito male quello che stavi dicendo.... Boh...

Urizen
02-01-2006, 13:26
grazie raga per aver risposto ...
ora provo con i vostri suggerimenti ... poi vi dico come va ...

Urizen
02-01-2006, 13:53
il codice sopra crea il seguente schema :


aux
||
info1|next|*v|rif => v1,v2,v3,...,vn
||
info2|next|*v|rif => v1,v2,v3,...,vn
||
info3|next|*v|rif => v1,v2,v3,...,vn
||
...



praticamente la classe A crea un puntatore ad una lista di nodi,
dove ogni nodo ha un campo puntatore a list che punta ad una lista di valori ...

ora io vorrei rendere l'oggetto di tipo A vuoto ...
quindi mi creo un puntatore che punta al primo nodo(info1) ...
faccio puntare aux al successivo nodo(info2)...
cancello il puntatore che punta al primo nodo(info1) ...


template <class k, class v>
void A<k, v>::A::clear()
{B* punt=aux.puntatore;
aux=aux->next;
delete punt;
};


se faccio questo procedimento, il codice mi cancella il puntatore che punta al primo nodo(info1) ...
ma cambia i valori info a tutti i nodi rimanenti ... tutta colpa di delete punt: infatti, se lo tolgo, funzionerebbe
ma non come voglio io ...

Urizen
02-01-2006, 14:28
grazie raga ...

risolto tutto ... ora funzia ... :yeah:

il compilatore a volte fa ti testa sua ... compilo ... errore ... ri-compilo ... fa quello che dico io ...