[解決済み】 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の定義にアクセスできないので、コンパイラはエラーを発生します。
関連
-
コマンドによるフォルダの簡単なインクリメンタルバックアップ(win/linux)
-
スクリプトとは何かを簡単に説明します。
-
スプレッドシートに匹敵するオンライングリッドシステム。EditGrid
-
[解決済み】Jupyter Notebookが保存されない:postに'_xsrf'引数がない
-
[解決済み】c++のコンパイルエラーです。ISO C++はポインタと整数の比較を禁止しています。
-
[解決済み】recyclerview アダプタが添付されていないため、レイアウトをスキップしています。
-
[解決済み】例外:AAPT2エラー:詳細はログを確認してください。
-
[解決済み】ファイルにデータを書き込むときにこのエラーが発生する理由
-
[解決済み] ポインタからキャストを使わずに整数を返す [-Wint-conversion] 戻り値の候補を作る
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Swift言語とAppleScriptの違い、AppleScriptの開発状況について教えてください。
-
期限切れのアカウントを自動的に禁止するRouterOSスクリプト
-
合理的オブジェクトスクリプトコマンド
-
スクリプトとは何かを簡単に説明します。
-
[解決済み】lm.fit(x,y,offset = offset, singular.ok,...) boxcox式で0非NAケースでエラーになる。
-
[解決済み】c++のコンパイルエラーです。ISO C++はポインタと整数の比較を禁止しています。
-
[解決済み】「名前空間はフィールドやメソッドなどのメンバーを直接含むことはできない」 [閉店]のお知らせ]
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】ggplot2使用時の永続的な無効なグラフィックス状態エラー
-
[解決済み】AdMobにアプリケーションを入れたら「ライブラリが見つからない」というエラーが出た