|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2003
Città: <049/>
Messaggi: 125
|
[C++] >>> Problemi con distruttore template di classe
Codice:
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();
}
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 ... Ultima modifica di Urizen : 02-01-2006 alle 11:19. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
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.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non si fanno mai chiamate esplicite al distruttore...se sei obbligato a farla hai un problema di design...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Comunque se vuoi chiamare il distruttore di aux la sintassi è questa: aux.~C()
Anche per primo la sintaasi dovrebbe essere questa: primo.~A(); |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ho capito male quello che stavi dicendo.... Boh...
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Oct 2003
Città: <049/>
Messaggi: 125
|
grazie raga per aver risposto ...
ora provo con i vostri suggerimenti ... poi vi dico come va ... |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Oct 2003
Città: <049/>
Messaggi: 125
|
il codice sopra crea il seguente schema :
Codice:
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 || ... 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) ... Codice:
template <class k, class v>
void A<k, v>::A::clear()
{B* punt=aux.puntatore;
aux=aux->next;
delete punt;
};
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 ... |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Oct 2003
Città: <049/>
Messaggi: 125
|
grazie raga ...
risolto tutto ... ora funzia ... il compilatore a volte fa ti testa sua ... compilo ... errore ... ri-compilo ... fa quello che dico io ... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:48.



















