0

クラスAとクラスBがあるとします。

A の .h には B の .h が必要であり、B の .h には A の .h が必要です (need = #include)。

すべての .h にはガードがあります:

#ifndef _classX_
#define _classX_
...
...
#endif

しかし、A の .cpp をコンパイルすると、B の .h がインクルードされると、A クラスは既にガードを使用しているため、B クラスは A クラスの .h をインクルードできません。

どうすればこれを解決できますか?

4

2 に答える 2

5

いずれかのクラスの前方宣言が必要になります。

// a.h
// do not #include b.h

class B;    // forward declaration

class A {
    ....
    B * b;
};

クラス A に実際の B インスタンスを含めることはできないことに注意してください。これは、ポインターまたは参照でなければなりません。また、ヘッダーの B ポインターを介して関数を呼び出すことはできません。両方のヘッダーを #include する .cpp ソース ファイルに入れる必要があります。

于 2010-06-06T21:00:37.193 に答える
3

それらの1つは、それを含めないように回避する必要があります。多くの場合、これは可能で、#include を .cpp ファイルに移動できます。

class A {
  // no need for header of B here
  void f(B b);

  // no need for header of B here either
  B *b;
};

一般に、定義が .cpp ファイルにある関数宣言の場合、ヘッダーに #includes は必要ありません。クラス メンバーの場合、それらを値オブジェクトとして埋め込みたい場合にのみヘッダーが必要です。newその場合、それらをポインター (またはスマートポインター) に変更し、.cpp ファイル内でそれらを変更する必要があります。コンパイラが上記の例の内容を認識できるようにするには、次のようBに定義の前に前方宣言を配置するだけです。A

class B;
于 2010-06-06T21:02:23.220 に答える