web-dev-qa-db-fra.com

Erreur - utilisation non valide de type incomplet / déclaration à terme de

Mon problème est assez courant, je sais, mais j'ai cherché et essayé toutes les solutions que j'ai trouvées et ne fonctionne toujours pas. Donc, toute aide serait grandement appréciée! =)

Merci d'avance!

J'ai cette erreur lors de la compilation:

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

Donc, fondamentalement, j'ai un contenant principal (main.cpp)

#include "Core.hh"

int        main(void)
{
  ...
}

Voici le fichier d'en-tête contenant toutes mes inclusions (Core.hh)

#ifndef __CORE_HH__
# define __CORE_HH__

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

class Core
{
  ...
};

#endif /* __CORE_HH__ */

Et puis les fichiers qui me causent des problèmes (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__ */
19
Remi M

Problème # 1:
Vous devez dériver uniquement d'une classe entièrement déclarée, sinon le compilateur ne saurait pas quoi faire.
Supprimer la déclaration à terme class Object;.

Problème # 2:
Vous avez une dépendance circulaire partout:

  • Dans "Core.hh", vous incluez "Object.hh", "MapLink.hh" et "Player.hh".
  • Dans "Object.hh", "MapLink.hh" et "Player.hh", vous incluez "Core.hh".

Vous devez vous assurer que chaque classe inclut entièrement la classe dont elle hérite.
Je ne sais pas comment les classes interagissent les unes avec les autres, vous devriez fournir ce détail dans la question.
Je suppose que vous devez modifier vos inclusions comme suit:

  • Modifiez "MapLink.hh" et "PlayerLink.hh" afin qu'ils incluent "Object.hh", pas "Core.hh"
  • Modifiez "Object.hh" afin qu'il n'inclue pas "Core.hh".
14
Eitan T

Le compilateur doit connaître l'interface complète d'une classe pour l'héritage. Dans ce cas, le compilateur n'a pas pu voir votre objet. Il est nécessaire d'inclure object.hh fichier dans d'autres fichiers

1
zapredelom

Suivez les inclus:

  1. Object.hh - __OBJECT_H__ est défini
  2. Core.hh - __CORE_H__ est défini
  3. MapLink.hh - comprend Core.hh, mais le contenu de ce fichier n'est pas inclus en raison de l'étape 2 et du #ifndef.
  4. Player.hh - Identique à l'étape 3.

Donc MapLink.hh et Player.hh ne voit pas la définition de Object avant d'essayer d'en hériter, et vous ne pouvez pas hériter de une classe qui n'a pas été entièrement définie.

Pour corriger: incluez spécifiquement l'en-tête de la classe dont vous héritez.
Autrement dit, ajoutez #include "Object.hh" à MapLink.hh et Player.hh.

0
molbdnilo