PDA

Visualizza la versione completa : [C++] Classi reciproche


Sgrulka
05-12-2003, 00:56
Salve a tutti, sto iniziando a cimentarmi nel C++ ma ho qualche problemino... vi espongo subito i fatti:
Devo dichiarare due classi, e ognuna delle due deve avere un riferimento all'altra. Ho scritto un piccolo esempio... Pippo deve avere un riferimento a Pluto, Pluto deve avere un riferimento a Pippo.
Quando dichiaro la variabile Pluto all'interno della classe Pippo, ricevo un errore perche' la classe Pluto non e' ancora stata dichiarata. Come devo fare?
Ecco il codice, scritto per comodita' tutto su un unico file:





#include <string>
#include <iostream>


class Pippo {

public:

void saluta(Pluto *p) {
std::cout<<"Ciao a "<<p->getNome()<<" da "<<this->getNome()<<std::endl;
}

std::string getNome() {
return "Pippo";
}

};


class Pluto {

public:

void saluta(Pippo *p) {
std::cout<<"Ciao a "<<p->getNome()<<" da "<<this->getNome()<<std::endl;
}

std::string getNome() {
return "Pluto";
}

};


int main() {
Pippo* pippo;
pippo=new Pippo();
Pluto* pluto;
pluto=new Pluto();
pippo->saluta(pippo);
pluto->saluta(pluto);
return 0;
}

Luc@s
05-12-2003, 07:15
#include <string>
#include <iostream>

using namespace std;

class Pippo; // nota pre- dichiarazione

class Pluto {

public:

Pluto();
~Pluto();
void saluta(Pippo *p) {
cout<<"Ciao a "<<p->getNome()<<" da "<<this->getNome()<<endl;
}

string getNome() {
return "Pluto";
}

};


class Pluto; // nota pre- dichiarazione

class Pippo {

public:
Pippo();
~Plppo();
void saluta(Pluto *p) {
cout<<"Ciao a "<<p->getNome()<<" da "<<this->getNome()<<std::endl;
}

string getNome() {
return "Pippo";
}

};


int main() {
Pippo* pippo;
pippo=new Pippo();
Pluto* pluto;
pluto=new Pluto();
pippo->saluta(pippo);
pluto->saluta(pluto);
return 0;
}

Sgrulka
05-12-2003, 14:29
Ciao ti ringrazio per l'aiuto... adesso in effetti riesce a riconoscere la classe.
Pero' c'e un altro problema... :dh:
Riconosce la classe ma non il metodo. Cioe':


class Pluto {

public:

void saluta(Pippo *p) {
cout<<"Ciao a "<<p->getNome()<<" da "<<this->getNome()<<endl;
}

string getNome() {
return "Pluto";
}

};


Ora non mi da' piu' l'errore quando incontra Pippo *p, pero' mi da' errore quando cerco di chiamare p->getNome()...
Per caso si possono predichiarare anche i metodi?
Ciao e grazie 1000 !!! :)

Luc@s
05-12-2003, 14:52
#include <string>
#include <iostream>

using namespace std;

class Pippo; // nota pre- dichiarazione
class Pluto; // nota pre- dichiarazione

class Pluto
{
public:
Pluto(){};
~Pluto(){};
int saluta(Pippo *p);
string getNome(){ return string("Pluto"); };

};
int Pluto::saluta(Pippo * p)
{
cout<< "Ciao a "<< p->getNome().c_str() << " da " << getNome().c_str()<<endl;
return 0;
}


// class Pluto; // nota pre- dichiarazione

class Pippo
{
public:
Pippo(){};
~Pippo(){};
int saluta(Pluto *p);
string getNome(){ return string("Pippo"); };

};
int Pippo::saluta(Pluto * p)
{
cout<< "Ciao a "<< p->getNome().c_str() << " da " << getNome().c_str()<<endl;
return 0;
}



int main() {
Pippo * pippo = new Pippo();
Pluto * pluto = new Pluto();
pippo->saluta(pippo);
pluto->saluta(pluto);
return 0;
}

Sgrulka
05-12-2003, 20:53
Grazie 1000, finalmente sono riucito a capire il meccanismo... :)
Ecco il codice funzionante:


#include <string>
#include <iostream>

using namespace std;

class Pippo; // pre-dichiarazione
class Pluto; // pre-dichiarazione

class Pluto {
public:
Pluto(){};
~Pluto(){};
void saluta(Pippo *p);
string getNome(){ return "Pluto"; };

};
class Pippo {
public:
Pippo(){};
~Pippo(){};
void saluta(Pluto *p);
string getNome(){ return "Pippo"; };

};
void Pluto::saluta(Pippo * pippo) {
cout<< "Ciao a "<< pippo->getNome() << " da " << this->getNome() << endl;
}
void Pippo::saluta(Pluto * pluto) {
cout<< "Ciao a "<< pluto->getNome() << " da " << this->getNome() << endl;
}
int main() {
Pippo * pippo = new Pippo();
Pluto * pluto = new Pluto();
pippo->saluta(pluto);
pluto->saluta(pippo);
return 0;
}

Finalmente Pippo e Pluto possono salutarsi a vicenda... :D
Ciao! :ciauz:

andypower
06-12-2003, 19:46
Scusate ragazzi, questo post nn pertinente al problema ma vorrei sapere come fate ad abilitare la visualizzazzione colorata della sintassi nel forum? Ho visto che tiene anche la spaziatura...

Loading