Problema con prototipos/cabeceras en c++

Manuel
31 de Julio del 2002
Hola,

tengo el siguiente problema. He definido dos clases en c++ (A y B), A tiene definido como atributo un objeto B, y B tiene definido como atributo un objeto A.
El problema es que al compilar, al evaluarse los prototipos me sale error, pues al evaluar uno necesita del otro, y al evaluar el otro necesita del primero.
Como puedo solucionar esto?

gracias

herraiz
31 de Julio del 2002
Si tienes las dos clases definidas dentro del mismo archivo fuente (y por tanto comparten el mismo archivo de encabezado) debes hacer lo siguiente: en el archivo '.h', si defines antes la clase A (que instancia al objeto B, y por tanto necesita que esté definida la clase B), incluye esta línea antes de la de 'class A':

class B;

class A
{
public:
A()
....

Y luego más abajo define la clase B.

Con la línea anterior le dices al compilador que vas a usar una clase que todavía no has definido pero que vas a definir.

herraiz
31 de Julio del 2002
Lo mejor sería que dividieras las clases en diferentes archivos (A.h, A.cpp y B.h y B.cpp). Los archivos de encabezado deberían quedar de una manera parecida a ésta:

// Archivo A.h

#ifndef _A_H_
#define _A_H_

#include "B.h"

class A
{
public:
A();
~A();

private:
B instancia_de_B;
};

#endif // end of _A_H_

------------------------------
// Archivo B.h

#ifndef _B_H_
#define _B_H_

#include "A.h"

class B
{
public:
B();
~B();

private:
A instancia_de_A;
};

#endif // end of _B_H_

---------------------------

Con los #define, #ifdef, etc, evitas que el compilador duplique la información contenida en los archivos de encabezado (por ejemplo, si los usas en diferentes módulos de un programa), ahorrando memoria, ya que es suficiente con que se incluyan una vez.