1. ホーム
  2. c++

[解決済み] エラー - 不完全な型の無効な使用 / の前方宣言

2022-02-01 15:29:27

質問

私の問題はかなり一般的だと思いますが、検索して見つけたあらゆる解決策を試しましたが、まだうまくいきません。だから、任意のヘルプは非常に高く評価されるでしょう =)

ありがとうございました。

コンパイル時にこのエラーが発生しました。

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)
{
  ...
}

以下は、私のすべてのインクルードを含むヘッダーファイル(Core.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__ */

(プレイヤー.hh)

#ifndef __PLAYER_H__
# define __PLAYER_H__

#include "Core.hh"

class Object;

class Player : public Object
{
  ...
};

#endif /* __PLAYER_H__ */

解決方法は?

問題点その1。
完全に宣言されたクラスからのみ派生させなければならない。そうでなければ、コンパイラは何をしたらよいかわからない。
前方宣言を削除する class Object; .

問題点その2。
循環型依存関係があちこちで発生していますね。

  • Core.hhの中に、Object.hh、MapLink.hh、Player.hhが含まれています。
  • Object.hh、MapLink.hh、Player.hhでは、Core.hhをインクルードしています。

各クラスが、継承するクラスを完全に含んでいることを確認する必要があります。
クラスがどのように相互作用しているのかよくわからないので、その詳細を質問で教えてください。
私の推測では、以下のようにインクルードを修正する必要があると思います。

  • MapLink.hh" と PlayerLink.hh" が "Core.hh" ではなく "Object.hh" を含むように修正します。
  • Object.hh" が "Core.hh" を含まないように修正します。