ヘッダーを含める順序が重要な循環依存の問題に遭遇しました。この問題は似ていますが、一方のクラスがもう一方のオブジェクトをインスタンス化するソリューションについては説明していません。
問題:
- 私には2つのクラスがあります:FooとBarです。バーはテンプレート化されています。(Fooはテンプレート化されている場合とされていない場合があります)。
- FooにはBarのインスタンスがあり、BarにはタイプFooのポインターがあり、Barの実装はこのポインターを介してFooのメンバーにアクセスする必要があります。
- FooとBarは 別々のファイル内に実装する必要があります。Barはテンプレート化されているため、その宣言と実装は同じファイルに含まれている必要があります。
次のコードでは、main.cppにFoo.hの前にBar.hが含まれている場合、コードはコンパイルされますが、Foo.hがBar.hの前に含まれている場合はコンパイルされません。main.cppにヘッダーが含まれている順序に関係なく、コードをコンパイルする方法はありますか?
Foo.h
#ifndef FOO_H
#define FOO_H
#include"Bar.h"
class Foo
{
public:
Bar<> B;
void fooStuff(){};
};
#endif
Bar.h
#ifndef BAR_H
#define BAR_H
class Foo;
template<int N=0> class Bar
{
public:
Foo * F;
void barStuff();
};
#include"Foo.h"
template<int N> void Bar<N>::barStuff()
{
F->fooStuff();
};
#endif
main.cpp
#include"Foo.h"
#include"Bar.h"
int main()
{
Foo F;
F.B.barStuff();
};