1. ホーム
  2. スクリプト・コラム
  3. その他

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

2022-01-10 01:28:46

質問事項

私は最近、次のようなコードを持つプログラムを書きました。

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

PlayerとBallという2つのクラスがあり、どちらも相手の情報を利用する必要があります。コードのどこかの時点で、両方とも他方の参照を渡されます(両方の.hファイルを含む別のクラスから)。

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

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

どのように解決するのですか?

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

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のデータ・メンバーにアクセスするため、クラスBallの完全な定義を必要とします。

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