0

私は3つのクラスを持っています:

ClassA.h

ClassA
{
    public:
        ClassA();
};

ClassB.h

#include "ClassA.h"

classB
{
    public:
        ClassB();

    private:
        ClassA m_classA;
};

ClassC.h

#include "ClassB.h"

ClassC
{
    public:
        ClassC();

    private:
        ClassB m_classB;
};

ClassC には ClassB が必要で、ClassB には ClassA が必要です。ClassC は ClassA を必要としないので、ソース ファイル内の ClassB ヘッダー内にある #include "ClassA.h" を配置してグローバル オブジェクトを作成する必要がありますか、それともより良い方法はありますか?

ClassB.cpp

#include "ClassB.h"
#include "ClassA.h"

ClassA g_classA;
4

1 に答える 1

3

ClassBにはClassAオブジェクトがあるため、そのクラス宣言には。の完全な宣言が必要ですClassA。したがって、で何が起こるかに関係なく、ClassA.hヘッダーをClassB.h*に含める必要がありますClassC

ヘッダーを含めたくない場合は、(スマート)ポインターを格納し、classAそれを前方宣言することができます。次に、に含める必要があるだけclassA.hですclassB.cpp。簡単な例を次に示します。

A.h

class A {};

B.h

#include <unique_ptr>

class A; // forward declaration of A

class B {
 public:
  B();
 private:
  std::unique_ptr<A> a_; // C++11 smart pointer expressing unique ownership
};

B.cpp

#include "B.h"
#include "A.h" // we need the full declaration here.

B::B() : a_(new A()) {}

*厳密に言えば、ClassA.h間接的にに含まれている限り、他のファイルに含めることができますClassB.h。ただし、間接的なインクルードに依存するのではなく、必要な場所に必要なものをインクルードすることをお勧めします。

于 2013-01-17T21:18:41.270 に答える