2012-06-27 18 views
17

Mi problema es bastante común, lo sé, pero he estado buscando y probando todas las soluciones que encontré y que todavía no funciona. ¡Entonces cualquier ayuda sería muy apreciada! =)Error: uso no válido del tipo incompleto/declaración directa de

¡Gracias de antemano!

que tienen este error durante la compilación:

g++ -ISFML/include -Iclasses/ -W -Wall -Werror -c -o classes/Object.o classes/Object.cpp 
In file included from classes/Core.hh:18:0, 
     from classes/Object.hh:4, 
     from classes/Object.cpp:1: 
classes/MapLink.hh:9:1: error: invalid use of incomplete type ‘struct Object’ 
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’ 
In file included from classes/Core.hh:19:0, 
     from classes/Object.hh:4, 
     from classes/Object.cpp:1: 
classes/Player.hh:9:1: error: invalid use of incomplete type ‘struct Object’ 
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’ 
make: *** [classes/Object.o] Error 1 

Así que, básicamente, tengo una principal que contiene (main.cpp)

#include "Core.hh" 

int  main(void) 
{ 
    ... 
} 

Aquí está el archivo de cabecera que contiene toda mi incluye (Core .hh)

#ifndef __CORE_HH__ 
# define __CORE_HH__ 

#include ... 
#include "Object.hh" 
#include "MapLink.hh" 
#include "Player.hh" 

class Core 
{ 
    ... 
}; 

#endif /* __CORE_HH__ */ 

Y a continuación, los archivos que están causando que me molesta (Object.hh)

#ifndef __OBJECT_HH__ 
# define __OBJECT_HH__ 

#include "Core.hh" 

class Object 
{ 
    ... 
}; 

#endif /* __OBJECT_HH__ */ 

(MapLink.hh)

#ifndef __MAPLINK_H__ 
# define __MAPLINK_H__ 

#include "Core.hh" 

class Object; 

class MapLink : public Object 
{ 
    ... 
}; 

#endif /* __MAPLINK_H__ */ 

(Player.hh)

#ifndef __PLAYER_H__ 
# define __PLAYER_H__ 

#include "Core.hh" 

class Object; 

class Player : public Object 
{ 
    ... 
}; 

#endif /* __PLAYER_H__ */ 
+2

No debe usar [nombres reservados] (http://stackoverflow.com/questions/228783) para guardias de encabezado; podría dar lugar a problemas como http://stackoverflow.com/questions/3345159 –

+1

Aquí hay una solución para mi propia situación con los mismos errores en su título, pero tal vez no sea para usted: tuve que incluir el encabezado de esa clase bajo denuncia en mi cpp, si el método público de la clase fue referido por otra clase. También tuve dependencias muy complejas y uso mixto de declaraciones forward e incluye. Lo escribo aquí más como una nota que como una solución, ya que usted ya tenía una. – kakyo

Respuesta

11

Problema # 1:
Debe derivar sólo de una clase totalmente declarado, de lo contrario el compilador no sabría qué hacer.
Elimina la declaración directa class Object;.

Problema # 2:
Usted tiene una dependencia circular en todo:

  • En "Core.hh" que incluye "Object.hh", "MapLink.hh" y "Player.hh ".
  • En "Object.hh", "MapLink.hh" y "Player.hh", incluye "Core.hh".

Debe asegurarse de que cada clase incluya completamente la clase heredada.
No estoy seguro de cómo las clases interactúan entre sí, debe proporcionar ese detalle en la pregunta.
Mi conjetura es que se necesita modificar sus inclusiones de la siguiente manera:

  • Modificar "MapLink.hh" y "PlayerLink.hh" para que incluyan "Object.hh", no "Core.hh"
  • Modifica "Object.hh" para que no incluya "Core.hh".
+0

No hay referencia entre sí en Core.hh/Object.hh – Azuli42

+0

Quería obtener todo SFML incluye pero tienes razón, incluido todo el Core.hh es una mala idea. Probando eso – Azuli42

+1

¡Eso es mucho mejor! Muchas gracias, señor Eitan: D – Azuli42

1

El compilador debe conocer la interfaz completa de una clase para la herencia. En este caso, el compilador no pudo ver su objeto.Es necesario incluir object.hh archivo en otros archivos

+0

¡Gracias por su respuesta! lo siento, me olvidé de mencionar que "Object.hh" ya está incluido en Player.cpp y MapLink.cpp y sigue recibiendo ese error! – Azuli42

0

Siga los includes:

  1. Object.hh - __OBJECT_H__ se define
  2. Core.hh - __CORE_H__ se define
  3. MapLink.hh - incluye Core.hh, pero el contenido de ese archivo no está incluido debido al paso 2 y al #ifndef.
  4. Player.hh - Igual que en el paso 3.

Así MapLink.hh y Player.hh no llegan a ver la definición de Object antes de tratar de heredar de él, y usted no puede heredar de una clase que no ha sido completamente definido.

Para corregir: incluya específicamente el encabezado de la clase que está heredando.
Es decir, agregue #include "Object.hh" a MapLink.hh y Player.hh.

+0

¡Gracias por ayudarme! Da el mismo error ... ¡No entiendo cómo algo tan simple me está causando tantos problemas! – Azuli42

Cuestiones relacionadas