[解決済み】C++でクラス名が型名にならない
2022-02-09 05:19:13
質問
C++でプログラミングを始めたばかりですが、2つのクラスを作成して、一方が他方を含むようにしようとしました。
ファイル
A.h
:
#ifndef _A_h
#define _A_h
class A{
public:
A(int id);
private:
int _id;
B _b; // HERE I GET A COMPILATION ERROR: B does not name a type
};
#endif
ファイル
A.cpp
:
#include "A.h"
#include "B.h"
#include <cstdio>
A::A(int id): _id(id), _b(){
printf("hello\n the id is: %d\n", _id);
}
ファイル
B.h
:
#ifndef _B_h
#define _B_h
class B{
public:
B();
};
#endif
ファイル
B.cpp
:
#include "B.h"
#include <cstdio>
B::B(){
printf("this is hello from B\n");
}
まずBクラスをコンパイルし、次にAクラスをコンパイルするのですが、エラーメッセージが表示されます。
A.h:9: error: 'B' does not name a type
この問題を解決するにはどうしたらいいですか?
どのように解決するのですか?
プリプロセッサは、ファイルの内容を挿入します。
A.h
と
B.h
を使用することができます。
include
ステートメントが発生します (これは実際には単なるコピー・ペーストです)。コンパイラが
A.cpp
の宣言が見つかります。
A
について知る前に、クラス
B
. このため、ご覧のようなエラーが発生します。これを解決するには、2つの方法があります。
-
以下を含む
B.h
でA.h
. 一般的に、ヘッダーファイルは必要なファイルにインクルードするのが良い方法です。他のヘッダを間接的にインクルードしたり、コンパイル単位(cpp-file)で特別な順序でインクルードしたりすると、プロジェクトが大きくなったときに、あなたや他の人を混乱させるだけでしょう。 -
型のメンバ変数を使用する場合
B
クラス内のA
の正確で完全な宣言をコンパイラが知る必要があります。B
のメモリレイアウトを作成する必要があるからです。A
. 一方、ポインタや参照でB
なぜなら、コンパイラがポインタや参照用に確保する必要のあるメモリは、クラス定義とは無関係だからです。この場合、次のようになります。class B; // forward declaration class A { public: A(int id); private: int _id; B & _b; };
これは、ヘッダー間の循環的な依存関係を避けるために非常に便利です。
お役に立てれば幸いです。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み】静的定数文字列(クラスメンバ)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] c++で構造体が型名にならない
-
[解決済み] C++で "X does not name a type "エラー