8

これと同様の質問が以前に行われたことは知っていますが、調査を行った後でも、円形ヘッダーのインクルードについて質問があります。

//FooA.h
#ifndef H_FOOA
#define H_FOOA

#include "foob.h"

class FooA{
   public:
      FooB *fooB;
};


//FooB.h
#ifndef H_FOOB
#define H_FOOB

class FooA;
class FooB{
   public:
      FooA *fooA;
};

今、私が2つの循環依存関係を持っている場合、これは、stackoverflowの人々が問題を回避するのを見た方法です。これに関する私の唯一の問題は、main.cppに最初にfooa.hを含め、次にfoob.hを含める必要があることです。

//main.cpp the right way
#include "fooa.h"
#include "foob.h"

//main.cpp that will surely get a compile error
#include "foob.h"
#include "fooa.h"

今私の質問は、「main.cppにヘッダーファイルをインクルードする順序を気にしない方法でこれらのクラスを前方宣言する方法はありますか?」です。

4

4 に答える 4

14

main.cppにヘッダーファイルをインクルードする順序を気にしない方法でこれらのクラスを前方宣言する方法はありますか?

単純なポインターのみを扱っているため、どちらの場合もここで前方宣言を使用できます。

FooA.h

#ifndef H_FOOA
#define H_FOOA

// #include "foob.h" << not needed!
class FooB;       // << substitute with a forward declaration of FooB

class FooA{
   public:
      FooB *fooB;
};
#endif

FooB.h

#ifndef H_FOOB
#define H_FOOB

class FooA;
class FooB{
   public:
      FooA *fooA;
};
#endif
于 2012-08-15T14:42:53.363 に答える
3

fooa.hが含まれfoob.hfoob.hの前方宣言があるため、順序を気にする必要はありませんFooA。コード内のすべてがすでに正しいです。

于 2012-08-15T14:42:42.793 に答える
1

どちらのクラスにもポインタが含まれているだけなので、他のヘッダーを含める必要はありません。前方宣言で十分です。

他のクラスを実際に使用するコードにはヘッダー必要ですが、それはcppファイルに含まれている必要があります。

于 2012-08-15T14:44:54.720 に答える
1

両方のヘッダーファイルで前方宣言を使用します。

同じ行で宣言できることをご存知ですか?

「FooB.h」で

class FooB{
    public:
        class FooA *fooA;
};

「FooA.h」で

class FooA {
    public:
        class FooB *fooB;
};
于 2012-08-15T14:46:42.057 に答える