1. ホーム
  2. c++

[解決済み】 c++ "Incomplete type not allowed" クラス参照情報へのアクセスエラー (前方宣言による循環依存性)

2022-02-11 14:56:03

質問事項

最近、私のコードで、循環型依存関係として私が知っているものにまつわるいくつかの問題がありました。簡単に言うと、PlayerとBallという2つのクラスがあり、どちらも他のクラスからの情報を使用する必要があります。コードのある時点で、両方とも他方の参照を渡されます(両方の.hファイルを含む別のクラスから)。

読んでみて、それぞれから#include.hファイルを削除して、前方宣言にしました。これで、クラスをお互いに宣言できるという問題は解決しましたが、渡されたオブジェクトの参照にアクセスしようとすると、"Incomplete type error"が発生するようになってしまったんです。似たような例はいくつかあるようですが、より複雑なコードと混在していることが多く、基本に絞り込むのは難しいです。

最もシンプルな形(基本的にはスケルトン)でコードを書き直しました。

Ball.h:

class Player;

class Ball {
public:
    Player& PlayerB;
    float ballPosX = 800;
private:

};

Player.h:

class Ball;

class Player {
public:
    void doSomething(Ball& ball);
private:
};

Player.cpp。

#include "Player.h"

void Player::doSomething(Ball& ball) {
    ball.ballPosX += 10;                   // incomplete type error occurs here.
}

なぜこのようなことが起こるのか、理解の助けになれば大変ありがたいのですが :)

解決方法は?

この順序で定義すると、コードはコンパイルされます。

class Ball;

class Player {
public:
    void doSomething(Ball& ball);
private:
};

class Ball {
public:
    Player& PlayerB;
    float ballPosX = 800;
private:

};

void Player::doSomething(Ball& ball) {
    ball.ballPosX += 10;                   // incomplete type error occurs here.
}

int main()
{
}

関数doSomethingの定義は、そのデータ・メンバーにアクセスするため、クラスBallの完全な定義を必要とします。

あなたのコード例では、モジュールPlayer.cppはクラスBallの定義にアクセスできないので、コンパイラはエラーを発生します。