Ver Mensaje Individual
  #7 (permalink)  
Antiguo 17/03/2016, 07:39
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problema con includes y clases una dentro de la otra

Código C++:
Ver original
  1. class Clase2;
  2.  
  3. class   Clase1 {
  4. public:
  5. Clase1(){};
  6.  
  7. void setClase(Clase2 * c ){c2 = c;}
  8.  
  9. void unaFuncion(){
  10. //idea 1
  11.     Clase2 c=*c2;//  ERROR
  12.      c.unaFuncion();
  13. };

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:

Código C++:
Ver original
  1. c2->unaFuncion();

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 original
  1. class Clase2;
  2.      
  3. class   Clase1 {
  4. public:
  5.     Clase1(){} // Los ; detrás de las llaves que cierran funciones no son necesarios
  6.      
  7.     void setClase(Clase2 * c ){ c2=c; }
  8.      
  9.     void unaFuncion();
  10.      
  11. private: // sugerencia
  12.     Clase2 * c2;
  13. };
  14.      
  15. class   Clase2 {
  16. public:
  17.     Clase2(){}
  18.      
  19.     void setClase(Clase1 * c ){c1 = c;}
  20.      
  21.     void unaFuncion(){
  22.         c1->unaFuncion();
  23.     }
  24.      
  25.     Clase1 * c1;
  26. };
  27.  
  28. // Llegados a este punto el compilador ya conoce la declaración de Clase2...
  29. void Clase1::unaFuncion()
  30. { 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.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.