PDA

Visualizza la versione completa : [C++] Errore in costruttore classe


gygabyte017
03-03-2006, 15:47
Che cosa è sbagliato in questa classe??



#include <iostream>
#include <string>

class Persona
{
public:
Persona(string cognome, string nome, int anni) : Cognome(cognome), Nome(nome), Anni(anni)
{
cout << "Nuova persona creata: " << Cognome << ", " << Nome << ", " Anni << endl;
}

~Persona()
{
cout << " persona distrutta: " << Cognome << ", " << Nome << ", " Anni << endl;
}

string Nome;
string Cognome;
int Anni;
};

int main(int argc, char* argv[])
{
Persona *Persone;

return 0;
}
//---------------------------------------------------------------------------


In compilartore mi segnala errore sui due punti (:) alla riga del costruttore dicendomi: " ) expected "

perché??

:ciauz: :ciauz:

pprllo
03-03-2006, 17:12
Ci sono diverse imprecisioni.
Prima di tutto non hai messo "using namespace std" all'inizio.
Già mettere questo ti risolverà quasi tutto.
Poi ci manca un "<<" su entrambi i cout.
Poi dovrebbe andare.
Se hai dubbi chiedi.

gygabyte017
03-03-2006, 18:22
hai ragione, che errori cretini...

gygabyte017
03-03-2006, 18:27
ho un nuovo problema su questa classe. non riesco a invocare il distruttore:



#include <iostream>
#include <string>

using namespace std;

class Persona
{
public:
Persona(){}
Persona(string cognome, string nome, int id) : Cognome(cognome), Nome(nome), Id(id)
{
cout << "Nuova persona creata: " << Cognome << ", "
<< Nome << ", ID=" << Id << endl;
}

~Persona()
{
cout << " persona distrutta: " << Cognome << ", "
<< Nome << ", ID=" << Id << endl;
}

string Nome;
string Cognome;
int Id;
};

int i = 0;
int MAX = 0;
Persona Persone[80];

void Crea()
{
string nome, cognome;
cout << "Cognome: ";
cin >> cognome;
cout << "Nome: ";
cin >> nome;
Persone[i++] = Persona(cognome, nome, i);
MAX++;
}

void Distruggi()
{
cout << "ID da distruggere: ";
int id;
for (int j = 0; j <= 10; j++)
if (Persone[j].Id==id);
Persone[j]=NULL;

}

void Mostra()
{
cout << "ID\t\tCognome\t\tNome\n";
for (int j = 0; j < MAX; j++)
//if (Persone[j]!=NULL)
cout << Persone[j].Id << "\t\t" << Persone[j].Cognome <<
"\t\t" << Persone[j].Nome << endl;

}

void Esci()
{
exit(0);
}

int main(int argc, char* argv[])
{
char scelta;
while (1)
{
cout << "1)Crea\n2)Distruggi\n3)Mostra\n4)Esci\n";
cin >> scelta;
switch (scelta)
{
case '1': Crea(); break;
case '2': Distruggi(); break;
case '3': Mostra(); break;
case '4': Esci(); break;
}

}


return 0;
}
//---------------------------------------------------------------------------

Quando faccio Persone[j]=NULL mi dice
[C++ Error] Unit1.cpp(48): E2285 Could not find a match for 'Persona::operator =(int)'

perchè??

pprllo
03-03-2006, 18:44
Mmm ... Vieni forse da qualche altro linguaggio ? Perchè l'assegnazione a NULL non è assolutamente il modo in cui si eliminano gli oggetti in C++. Il distruttore non può essere chiamato esplicitamente: la chiamata avviene solo quando va fuori ambito oppure quando si usa delete (che serve per la deallocazione della memoria dinamica).

gygabyte017
03-03-2006, 18:47
come dovrei usarlo il delete??

cmq si vengo dal delphi e sto studiando il c++

newbie
03-03-2006, 19:17
Se vuoi che l'assegnazione a NULL chiami il distruttore, devi fare l'overloading dell'operatore = in modo che chiami il distruttore (con la delete) se il membro destro dell'assegnazione è NULL. Almeno a livello di concetto... poi non so se sia consentito chiamare la delete di un oggetto di cui si sta eseguendo un suo metodo (l'operatore, che credo si comporti come un metodo).

:ciauz:

gygabyte017
03-03-2006, 19:58
se invece non voglio usare il null, come lo cancello??? quanl'è il modo "esatto" per eliminare una classe da un array di classi??

pprllo
03-03-2006, 21:05
Quando hai necessità di aggiungere ed eliminare elementi da un array, ovvero ti serve un array dinamico, devi usare l'allocazione dinamica della memoria, quindi si usano i puntatori e gli operatori new e delete. Non ha senso "eliminare" elementi da un array definito in modo "tradizionale" (cioè con le parentesi quadre) perchè non corrisponde alla funzione logica di quel tipo di array, che sono appunto per insiemi con dimensioni fisse.

gygabyte017
03-03-2006, 21:26
Ho dichiarato


Persona *Persone;

e ho lasciato tutto così tranne nel distruttore dove ho messo:


for (int j = 0; j <= 10; j++)
if (Persone[j].Id==id)
delete Persone[j];
ma il compilatore mi da questo errore:


[C++ Error] Unit1.cpp(48): E2157 Deleting an object requires exactly one conversion to pointer operator

perchè??

grazie

Loading