[解決済み] c++ "Incomplete type not allowed" クラス参照情報へのアクセスエラー (前方宣言による循環依存性)
2022-02-04 19:17:38
質問事項
最近、私のコードで、循環型依存関係として私が知っているものにまつわるいくつかの問題がありました。簡単に言うと、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の定義にアクセスできないので、コンパイラはエラーを発生します。
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された