2011-10-10 14 views
7

Tengo dos clases, foo y barra. foo incluye barra y contiene un std :: vector de punteros para barrar objetos. En algún punto durante el tiempo de ejecución, la barra tiene que acceder a este vector de punteros a otros objetos de la barra. Por lo tanto, foo contiene un método llamado getBarObjects() que devuelve la matriz de punteros.declaración directa con el vector del tipo de clase - puntero al tipo de clase incompleto no permitido

Por lo tanto, reenvio declarar foo en la barra. Obvioulsy también tengo que reenviar declarar el método que estoy usando - foo :: getBarObjects(). Como esto devuelve la matriz de punteros a la barra, me meto en un círculo vicioso.

No puedo reenviar incluir barra y luego simplemente reenviar incluir getBarObjects(), ya que esto da como resultado "nombre de tipo incompleto no permitido".

foo.h:

#include "bar.h" 
#include <vector> 

class foo { 
    public: 
     foo(); 
     ~foo(); 
     std::vector<bar*> getBarObjects(); 
    private: 
     std::vector<bar*> barObjects; 
} 

bar.h:

class foo; 
std::vector<bar*> foo::getBarObjects();  // error, doesn't know bar at this point 

class bar { 
    public: 
     bar(foo *currentFoo); 
     ~bar(); 
     bool dosth(); 
    private: 
     foo *thisFoo; 
} 

bar.cpp:

#include "bar.h" 

bool bar(foo *currentFoo) { 
    thisFoo = currentFoo; 
} 

bool bar::dosth() { 
    thisFoo->getBarObjects();  // error, pointer to inomplete class type is not allowed 
} 

Si simplemente me incluyo al revés, voy a tener el mismo problema en foo lateron. ¿Alguna sugerencia?

Respuesta

15

No puede reenviar miembros declarar.

En su lugar, bar.cpp debe #include ambos foo.h y bar.h. Problema resuelto.

En general, si se utiliza la secuencia:

  • declaran plazo todo tipo de clase
  • Definir todos los tipos de clase
  • Cuerpos de miembros de la clase

todo estará bien.

+0

Meh, solución simple a un problema que parecía grande. ¡Gracias! – Aerius

1

Has olvidado reenviar declara el vector en foo.h. También devuelve el valor vector por valor de getBarObjects que posiblemente no sea el que desea y la declaración directa de la función de miembro es inútil.

También: Utilice protectores de cabecera. Prefiera el puntero inteligente apropiado para su situación (std::shared_ptr, unique_ptr) sobre punteros sin formato. Tenga cuidado con const ness.

+0

que utiliza guardias de cabecera, no se preocupe, simplemente dejarlos salir aquí como he escrito todo lo que para evitar confusiones con nombres de clases y otras cosas adicionales. Gracias aunque – Aerius

4

No tiene que incluir foo.h o bar.h el uno del otro a menos que esté accediendo a las partes internas de cualquier clase del otro archivo de encabezado. Declare las clases según sea necesario en los archivos de encabezado, luego incluya ambos archivos de encabezado de su archivo fuente.

foo.h

#include <vector> 
class bar; 
class foo { 
    public: 
     foo(); 
     ~foo(); 
     std::vector<bar*> getBarObjects(); 
    private: 
     std::vector<bar*> barObjects; 
}; 

bar.h

class foo; 
class bar { 
    public: 
     bar(foo *currentFoo); 
     ~bar(); 
     bool dosth(); 
    private: 
     foo *thisFoo; 
} 

bar.CPP

#include "foo.h" 
#include "bar.h" 

bool bar(foo *currentFoo) { 
    thisFoo = currentFoo; 
} 

bool bar::dosth() { 
    thisFoo->getBarObjects(); 
} 
Cuestiones relacionadas