2012-06-27 8 views
17

私の問題はかなりよくわかっていますが、私が探し求めてきたすべての解決策を試してみましたが、まだ動作しません。だから、どんな助けも大歓迎です! =)エラー - 不完全な型/フォワード宣言の無効な使用

ありがとうございます!

そこで、基本的
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 

は、私が持っているメイン含む(main.cppに)

#include "Core.hh" 

int  main(void) 
{ 
    ... 
} 

ここにすべての私は、(コアを含むヘッダファイルがあります:

私は、コンパイル時にこのエラーが発生しています.hh)

#ifndef __CORE_HH__ 
# define __CORE_HH__ 

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

class Core 
{ 
    ... 
}; 

#endif /* __CORE_HH__ */ 

そして、私の問題を引き起こしているファイル(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

ヘッダーガードに[予約名](http://stackoverflow.com/questions/228783)を使用しないでください。 http://stackoverflow.com/questions/3345159 –

+1

のような問題につながる可能性がありますあなたのタイトルに同じ誤りがありますが、おそらくあなたのための解決策はありません。そのクラスのヘッダーを苦情の下に含める必要がありましたクラスのパブリックメソッドが別のクラスによって参照された場合は、私のcppにあります。私には非常に複雑な依存関係があり、フォワード宣言を混在して使用しています。私はあなたがすでにそれを持っていたので、解決策よりもノートとしてここに書いています。 – kakyo

答えて

11

問題#1:
あなたがそうでなければ、完全に宣言されたクラスからのみ派生しなければなりませんコンパイラは何をすべきか分からないでしょう。
前方宣言class Object;を削除します。

問題#2:
あなたはすべての上に円形の依存関係があります:あなたは "Object.hh"、 "MapLink.hh" と「Player.hhが含まれる "Core.hh" で

  • を"
  • "Object.hh"、 "MapLink.hh"、 "Player.hh"には "Core.hh"が含まれています。

各クラスに継承するクラスが完全に含まれていることを確認する必要があります。
私はクラスがどのように相互作用しているのかよく分かりませんが、質問にその詳細を記入する必要があります。
私の推測では、次のように介在物を変更する必要があるということです。

  • 変更「MapLink.hh」と「PlayerLink.hh」彼らは「Object.hh」ではなく、「Core.hh」が含まれるよう
  • "Object.hh"に "Core.hh"が含まれないように変更してください。
+0

Core.hh/Object.hhにお互いの参照はありません – Azuli42

+0

私はすべてのSFMLが含まれているようにしたいと思っていますが、あなたはCore.hh全体を含めて正しいと思います!それを試して – Azuli42

+1

それはずっと良いです!あなたに非常に多くのミスターEitanありがとう:D – Azuli42

1

コンパイラは、継承のためのクラスの完全なインタフェースを知っている必要があります。この場合、コンパイラはあなたのオブジェクトを見ることができませんでした。これは、フォローの他のファイル

+0

あなたの返信ありがとう!申し訳ありませんが、 "Object.hh"が既にPlayer.cppとMapLink.cppに含まれていて、まだそのエラーが表示されています。 – Azuli42

0

の中object.hhファイルをインクルードする必要があります:

  • MapLink.hh定義され__CORE_H__ - - - __OBJECT_H__
  • Core.hhを定義している

    1. Object.hhが含まCore.hhを、しかし、そのファイルの内容ステップ2と#ifndefのために含まれていません。
    2. Player.hh - ステップ3

    のでMapLink.hhPlayer.hhそのクラスから継承し、あなたがそれを継承しようとする前に、Objectの定義を参照して得ることはありません、あなたができないと同じ完全には定義されていない。

    修正するには、具体的には、継承元のクラスのヘッダーを追加します。
    #include "Object.hh"MapLink.hhPlayer.hhに追加します。

  • +0

    助けてくれてありがとう!それは同じエラーを与える..私はそれが何かが私にそれほどのトラブルを与えていることを理解していない! – Azuli42

    関連する問題