Código C++:
Ver originalclass Clase2;
class Clase1 {
public:
Clase1(){};
void setClase(Clase2 * c ){c2 = c;}
void unaFuncion(){
//idea 1
Clase2 c=*c2;// ERROR
c.unaFuncion();
};
Una pregunta tonta. ¿Has leído todo lo que te he puesto en la respuesta anterior? ¿Lo has entendido?
NO puedes usar un objeto por valor si no ha sido declarado previamente.
Huelga decir que tampoco es necesario eliminar un puntero para llamar a los miembros de una clase. Lo siguiente funcionaría sin problemas si el compilador conociese la declaración de Clase2:
Nota que en el caso de punteros hay que usar la flecha en lugar del punto.
¿Posible solución? Fácil. Usa archivos de cabecera y de código o poner primero las declaraciones de las clases y después las implementaciones:
Código C++:
Ver originalclass Clase2;
class Clase1 {
public:
Clase1(){} // Los ; detrás de las llaves que cierran funciones no son necesarios
void setClase(Clase2 * c ){ c2=c; }
void unaFuncion();
private: // sugerencia
Clase2 * c2;
};
class Clase2 {
public:
Clase2(){}
void setClase(Clase1 * c ){c1 = c;}
void unaFuncion(){
c1->unaFuncion();
}
Clase1 * c1;
};
// Llegados a este punto el compilador ya conoce la declaración de Clase2...
void Clase1::unaFuncion()
{ c2->unaFuncion(); } // ...y esto pasa a ser legal
Por cierto, nota que si
Clase1::unaFuncion llama a
Clase2::unaFuncion y este a su vez llama a
Clase1::unaFuncion el programa va a entrar en bucle y va a dejar de responder.
Un saludo.