Errore su distruttori

Riuzaki
ragazzi il compilatore di visual c++ mi da i seguenti due errori...

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
Rggb1
Io lo so! Usi VisualC++, questo è l'errore! :-D

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?

Riuzaki
no non aiuta -.-

Rggb1
Comunque, cominciamo da quel che il compilatore ti chiede

Hai definito Lista::~Lista() e TabellaHash::~TabellaHash()? Dove e come?

Riuzaki
si li ho definiti e rispettivamente il prototipo si trova nelle interfacce delle due classi e l'implementazione nei rispettivi file.cpp

Rggb1
Puoi postare il codice della classe Lista?

[ PS. Niente MSN, spiacente ;) ]

Riuzaki
#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

Riuzaki
se tolgo tutti i distruttori delle classi che ho fatto allora in quel caso compila...quindi l'errore deve essere li...

Rggb1
Hm... a quanto ho capito, l'errore è in main().

Probabilmente l'errore è Microsoft-relativo, hai provato a compilare senza far generare codice di debug?

Riuzaki
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:


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...

Rggb1
"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)?

Riuzaki
stesso identico messaggio di errore -.- sono disperato!

Rggb1
"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.

hamming_burst
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. :-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.