循環参照の問題 (つまり、Ah と Bh が相互に # を含む) があり、それを防ぐために #pragma once を使用するように勧められた人もいました。ただし、このソリューションはまだ機能していないようです。
何が起こっているかというと、Ah 以外のファイル (A.cpp でさえ) でクラス A が認識されなくなり、クラス B でも同じことが起こります。
コードをお見せしましょう:
ああ
#pragma once
#include "B.h"
class A {
public: B* b;
};
Bh
#pragma once
#include "A.h"
class B {
public: A* a;
};
A.cpp
#include "stdafx.h"
#include "A.h"
#include "B.h"
B.cppは A.cpp と同じです
エラー トレースは次のように表示されます。
1> B.cpp 1>c:\users\user\documents\visual studio 2010\projects\envmodel\test\bh(5): エラー C2143: 構文エラー: ';' がありません 前 ' ' 1>c:\users\user\documents\visual studio 2010\projects\envmodel\test\bh(5): エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int をサポートしていません 1>c:\users\user\documents\visual studio 2010\projects\envmodel\test\bh(5): エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int 1> A.cpp 1>c:\users\user\documents\visual studio 2010\projects\envmodel\test\bh(5): error C2143: syntax error: missing ';' をサポートしていません 前 '' 1>c:\users\user\documents\visual studio 2010\projects\envmodel\test\bh(5): エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int をサポートしていません 1>c:\users\user\documents\visual studio 2010\projects\envmodel\test\bh(5): エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int をサポートしていません
さらに明確にしたいことが2つあります。
Visual Studio 2010 で #include "stdafx.h" をいつどのように使用するか (私はこの IDE が本当に嫌いですが、C++ でうまく機能するのはこれだけのようです - Netbeans はこの言語では完全にゴミです)
#pragma once を正しく使用するには? 私はそれを各ファイルの最初の行に置くだけだと思います (まあ、明らかにそれは私の問題を解決しません!)。また、#include "stdafx.h" の前後に配置する必要がありますか? 注: #pragma once を stdafx.h に入れませんでした
ありがとう。
編集: セミコロンを忘れたため、元のエラー トレースが肥大化しました。Edit2:ポインターを使用するのを忘れていました。私の実際のプログラムでは、単純なオブジェクト値の代わりにポインターを使用していましたが、小さな例を作成するために急いでそれを無視しました。