Errore su distruttori
ragazzi il compilatore di visual c++ mi da i seguenti due errori...
non riesco a capire cosa possa essere...avete idea di che genere di errore si tratti?
1>------ Inizio ricompilazione: Progetto: 132684nerobruno, Configurazione: Debug Win32 ------ 1>Eliminazione file intermedi e file di output per il progetto '132684nerobruno', configurazione 'Debug|Win32' 1>Compilazione in corso... 1>ChiaveHash.cpp 1>main.cpp 1>Generazione del codice in corso... 1>Collegamento in corso... 1>main.obj : error LNK2019: riferimento al simbolo esterno "public: __thiscall Lista::~Lista(void)" (??1Lista@@QAE@XZ) non risolto nella funzione "public: void * __thiscall Lista::`vector deleting destructor'(unsigned int)" (??_ELista@@QAEPAXI@Z) 1>main.obj : error LNK2019: riferimento al simbolo esterno "public: __thiscall TabellaHash::~TabellaHash(void)" (??1TabellaHash@@QAE@XZ) non risolto nella funzione "public: __thiscall std::_List_nod<class TabellaHash,class std::allocator<class TabellaHash> >::_Node::~_Node(void)" (??1_Node@?$_List_nod@VTabellaHash@@V?$allocator@VTabellaHash@@@std@@@std@@QAE@XZ) 1>C:\Users\Bruno\Desktop\Progetto Algoritmi\132684nerobruno\Debug\132684nerobruno.exe : fatal error LNK1120: 2 esterni non risolti 1>Il log di compilazione è stato salvato in 'file://c:\Users\Bruno\Desktop\Progetto Algoritmi\132684nerobruno\132684nerobruno\Debug\BuildLog.htm' 1>132684nerobruno - 3 errore/i, 0 avviso/i ========== Ricompilazione: 0 completate, 1 non riuscite, 0 ignorate ==========
non riesco a capire cosa possa essere...avete idea di che genere di errore si tratti?
Risposte
Io lo so! Usi VisualC++, questo è l'errore! 
A parte gli scherzi, chiedo due cose:
1 - si capisce poco: c'è qualche \$ a giro nel post
2 - il log di compilazione non ti aiuta?

A parte gli scherzi, chiedo due cose:
1 - si capisce poco: c'è qualche \$ a giro nel post
2 - il log di compilazione non ti aiuta?
no non aiuta -.-
Comunque, cominciamo da quel che il compilatore ti chiede
Hai definito Lista::~Lista() e TabellaHash::~TabellaHash()? Dove e come?
Hai definito Lista::~Lista() e TabellaHash::~TabellaHash()? Dove e come?
si li ho definiti e rispettivamente il prototipo si trova nelle interfacce delle due classi e l'implementazione nei rispettivi file.cpp
Puoi postare il codice della classe Lista?
[ PS. Niente MSN, spiacente
]
[ PS. Niente MSN, spiacente

#include "Lista.h" ostream& operator<<(ostream& out, const Lista& l) { Nodo * tmp = l.getTesta(); while(tmp != 0) { out << *tmp <<endl; tmp = tmp->getNextNodo(); } return out; } Lista::Lista():testa(0),coda(0) { } Lista::~Lista() { if(testa == 0) return; while(testa != coda) { Nodo * tmp = testa; testa = testa->getNextNodo(); delete tmp; } delete testa; } Nodo* Lista::getTesta() const { return testa; } Nodo* Lista::getCoda() const { return coda; } void Lista::addInTesta(string i) { Nodo * tmp = testa; testa = new Nodo(i, tmp); if (coda == 0) coda = testa; } void Lista::addInCoda(string i) { Nodo* tmp = coda; coda = new Nodo(i,0); if (testa == 0) testa = coda; else tmp->setNextNodo(coda); } Nodo* Lista::cerca(string i) const { Nodo* tmp = testa; while(tmp != 0) { if(tmp->getValore() == i) break; tmp = tmp->getNextNodo(); } return tmp; } string Lista::valInTesta() const { assert(testa!=0); return testa->getValore(); } string Lista::valInCoda() const { assert(coda!=0); return coda->getValore(); } void Lista::delInTesta() { if(testa == 0) return; Nodo* tmp = testa; testa = tmp->getNextNodo(); delete tmp; } void Lista::delInCoda() { if(testa == coda) { delInTesta(); return; } Nodo * corr = testa; Nodo * prec = 0; while (corr != coda) { prec = corr; corr = corr->getNextNodo(); } prec->setNextNodo(0); delete coda; coda = prec; } void Lista::cancellaTutti(string i) { if (testa == 0) return; Nodo * corr = testa; Nodo * prec = 0; while (corr != 0) if (corr->getValore() == i) { Nodo * tmpCorr = corr; corr = corr->getNextNodo(); cancellaNodo(tmpCorr, prec); } else { prec = corr; corr = corr->getNextNodo(); } } void Lista::cancellaNodo(Nodo * daElim, Nodo * prec) { if (daElim == testa) { testa = daElim->getNextNodo(); if (daElim == coda) coda = 0; } else { if (daElim == coda) coda = prec; prec->setNextNodo(daElim->getNextNodo()); } delete daElim; } void Lista::svuota() { while (testa != 0) delInTesta(); } #ifndef LISTA_H #define LISTA_H #include "Nodo.h" #include <string> #include <assert.h> class Lista { public : Lista(); ~Lista(); Nodo* getTesta() const; Nodo* getCoda() const; void addInTesta(string); void addInCoda(string); Nodo* cerca(string) const; string valInTesta() const; string valInCoda() const; void delInTesta(); void delInCoda(); void cancellaTutti(string); void cancellaNodo(Nodo *, Nodo *); void svuota(); private: Nodo * testa; Nodo * coda; }; #endif
se tolgo tutti i distruttori delle classi che ho fatto allora in quel caso compila...quindi l'errore deve essere li...
Hm... a quanto ho capito, l'errore è in main().
Probabilmente l'errore è Microsoft-relativo, hai provato a compilare senza far generare codice di debug?
Probabilmente l'errore è Microsoft-relativo, hai provato a compilare senza far generare codice di debug?
facendola breve le tre classi che ho implementato sono tabellaHash.h, lista.h e vettore.h
rispettivamente tabellahash ha questi attributi:
Vettore tab;
int nEl;
ChiaveHash ch;
lista.h:
Nodo * testa;
Nodo * coda;
Vettore.h:
Lista * elementi;
int vimin, vimax;
orai rispetti distruttori e costruttori fanno questo:
le ho fatte tutte non template perchè mi interessa in particolare che agiscano sulle stringhe...
rispettivamente tabellahash ha questi attributi:
Vettore tab;
int nEl;
ChiaveHash ch;
lista.h:
Nodo * testa;
Nodo * coda;
Vettore.h:
Lista * elementi;
int vimin, vimax;
orai rispetti distruttori e costruttori fanno questo:
TabellaHash::TabellaHash() { nEl = 0; } Lista::Lista():testa(0),coda(0){} Vettore::Vettore() { vimin = 0; vimax = 61; elementi = new Lista[vimax + 1]; } Distruttori: Lista::~Lista() { if(testa == NULL) return; while(testa != coda) { Nodo * tmp = testa; testa = testa->getNextNodo(); delete tmp; } delete testa; } Vettore::~Vettore() { for(unsigned int i = 0; i <= vimax; i++) elementi[i].svuota(); delete [] elementi; } TabellaHash::~TabellaHash() { for ( card i = 1; i <= nCelle(); i++ ) tab[i].svuota(); }
le ho fatte tutte non template perchè mi interessa in particolare che agiscano sulle stringhe...
"Riuzaki":
se tolgo tutti i distruttori delle classi che ho fatto allora in quel caso compila...quindi l'errore deve essere li...
I nomi che vedi nella lista errori sono le funzioni che automaticamente Vc++ implementa sulle classi; puoi vedere cosa succede a non generare il debug code (ovvero in configurazione win32 e non debug)?
stesso identico messaggio di errore -.- sono disperato!
"Qui qualcosa non mi sconfinfera". Sembra che se metti un riferimento a qualcosa compilato in altro contesto, il riferimento non ci sia. Quindi potrebbe essere un errore in qualche inclusione e/o qualche impostazione di vc++
Puoi fare una prova finale? Fai un altro progetto, copincolli tutti i sorgenti su 'main_altro.cpp' con main.cpp alla fine, stessa cosa con gli headerfile (copi tutto assieme) e vedi che succede.
Puoi fare una prova finale? Fai un altro progetto, copincolli tutti i sorgenti su 'main_altro.cpp' con main.cpp alla fine, stessa cosa con gli headerfile (copi tutto assieme) e vedi che succede.
sono un attimo arruginito di C++, ma un possibile errore potrebbe essere non esplicitare nei metodi il parametro "void" quando un metodo è senza parametro, cioè quando è una procedura.
Tempo fa ottenni un errore del linker, come è successo a te, proprio per questo motivo (non ricordo però se era con linguaggio C++).
Forse non è il tuo caso, ma è sempre meglio provare.
Tempo fa ottenni un errore del linker, come è successo a te, proprio per questo motivo (non ricordo però se era con linguaggio C++).
Forse non è il tuo caso, ma è sempre meglio provare.
