私は C++ の初心者ですが、この (おそらく些細な) 質問に対する答えをオンラインで見つけることができませんでした。2 つのクラスが互いにインクルードしているコードのコンパイルに問題があります。まず、 #include ステートメントをマクロの内側または外側に配置する必要がありますか? 実際には、これは問題ではないようです。ただし、この特定のケースでは、問題が発生しています。#include ステートメントをマクロの外に置くと、コンパイラが再帰的に実行され、「#include ネストが深すぎます」というエラーが表示されます。#include が呼び出される前にどちらのクラスも完全に定義されていないため、これは私には理にかなっているようです。しかし、奇妙なことに、それらを中に入れようとすると、認識されないため、クラスの 1 つの型を宣言できません。本質的に、私がコンパイルしようとしているものは次のとおりです。
ああ
#ifndef A_H_
#define A_H_
#include "B.h"
class A
{
private:
B b;
public:
A() : b(*this) {}
};
#endif /*A_H_*/
Bh
#ifndef B_H_
#define B_H_
#include "A.h"
class B
{
private:
A& a;
public:
B(A& a) : a(a) {}
};
#endif /*B_H_*/
main.cpp
#include "A.h"
int main()
{
A a;
}
違いがある場合は、g++ 4.3.2 を使用しています。
明確にするために、一般的に、#include ステートメントはどこに行けばよいのでしょうか? 私は常にそれらがマクロの外に出ているのを見てきましたが、私が明確に説明したシナリオはこの原則を破っているようです. 事前にヘルパーに感謝します!ばかげた間違いを犯した場合は、私の意図を明確にすることを許可してください!