2012-06-27 19 views
17

Mój problem jest dość powszechny, wiem, ale szukałem i próbowałem wszystkich rozwiązań, które znalazłem i nadal nie działają. Tak więc każda pomoc będzie bardzo ceniona! =)Błąd - nieprawidłowe użycie niekompletnej deklaracji typu/przekazania

Z góry dziękuję!

mam ten błąd przy kompilacji:

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 

Więc w zasadzie, mam główny zawierający (main.cpp)

#include "Core.hh" 

int  main(void) 
{ 
    ... 
} 

oto nagłówek pliku zawierającego wszystkie moje obejmuje (Core .hh)

#ifndef __CORE_HH__ 
# define __CORE_HH__ 

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

class Core 
{ 
    ... 
}; 

#endif /* __CORE_HH__ */ 

A potem pliki, które są przyczyną mnie kłopoty (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

Nie należy używać [nazw zastrzeżonych] (http://stackoverflow.com/questions/228783) dla osłon nagłówka; może to prowadzić do problemów, takich jak http://stackoverflow.com/questions/3345159 –

+1

Oto rozwiązanie mojej własnej sytuacji z tymi samymi błędami w tytule, ale może nie dla ciebie: musiałem uwzględnić nagłówek tej klasy w skardze w moim cpp, jeśli publiczna metoda klasy została przywołana przez inną klasę. Miałem także bardzo złożone zależności i mieszane użycie deklaracji forward i obejmuje. Piszę to tutaj bardziej jako notatkę niż rozwiązanie, ponieważ już ją masz. – kakyo

Odpowiedz

11

Zadanie nr 1:
Musisz czerpać tylko z całkowicie deklarowanej klasy, inaczej kompilator nie wiedziałby, co robić.
Usuń deklarację przekazania class Object;.

Zadanie nr 2:
Masz kołową zależność całym:

  • w "Core.hh" dołączyć "Object.hh", "MapLink.hh" i „Player.hh ".
  • W "Object.hh", "MapLink.hh" i "Player.hh" należy wpisać "Core.hh".

Należy upewnić się, że każda klasa w pełni obejmuje klasę, z której dziedziczy.
Nie jestem pewien, w jaki sposób klasy wchodzą ze sobą w interakcje, należy podać te szczegóły w pytaniu.
Domyślam się, że trzeba zmodyfikować inkluzje następująco:

  • Modyfikuj „MapLink.hh” i „PlayerLink.hh” tak, że obejmują one „Object.hh”, a nie „Core.hh”
  • Zmodyfikuj "Object.hh" tak, aby nie zawierało "Core.hh".
+0

Brak odniesienia do siebie w Core.hh/Object.hh – Azuli42

+0

Chciałem, aby wszystkie SFML zawiera, ale masz rację, w tym cały Core.hh jest złym pomysłem! Próbuję to – Azuli42

+1

To znacznie lepiej! Dziękuję bardzo, panie Eitan: D – Azuli42

1

Kompilator musi znać pełny interfejs klasy dziedziczenia. W tym przypadku kompilator nie może zobaczyć Twojego obiektu.Jest to konieczne w celu włączenia object.hh plik w innych plikach

+0

Dzięki za odpowiedź! przepraszam, zapomniałem wspomnieć, że "Object.hh" jest już zawarty w Player.cpp i MapLink.cpp i nadal dostaje ten błąd! – Azuli42

0

Postępuj zgodnie obejmuje:

  1. Object.hh - __OBJECT_H__ definiuje
  2. Core.hh - __CORE_H__ definiuje
  3. MapLink.hh - obejmuje Core.hh, ale treść tego pliku nie jest uwzględniony z powodu kroku 2 i #ifndef.
  4. Player.hh - tak samo, jak krok 3.

Więc MapLink.hh i Player.hh nie dostać się do zobaczyć definicję Object zanim spróbujesz dziedziczyć z niej, a ty nie może dziedziczą z klasy, nie został w pełni zdefiniowany.

Aby naprawić: konkretnie dołącz nagłówek klasy, z której dziedziczysz.
Oznacza to, że należy dodać #include "Object.hh" do MapLink.hh i Player.hh.

+0

Dzięki za pomoc! Daje ten sam błąd .. Nie rozumiem, jak coś tak prostego sprawia mi tyle problemów! – Azuli42

Powiązane problemy