0

私はたくさんのクラスを持っています、そしてそれらは次のように互いに非常に近いです

class A
{
//code
};

class B
{
   A* field;
//code
};

class C: public B
{
//code
};

等々。A.hそして、それらを別々のヘッダー( 、 ...)に配置したいのですB.hが、このヘッダーをすべてプロジェクトに追加しないようにするには、のようなmyLib.hヘッダーが必要です。これは、作成したすべてのクラスを含めるために必要なヘッダーの1つにすぎません。どうすれば達成できますか?

#pragma once;また、使用せず、機能させると思います

#ifndef _MY_LIB_H
#define _MY_LIB_H
#endif

どこに置けばいいですか?すべてのヘッダーで?

私はそれを次のようにやってみました

class A;
class B;
...

myLib.h

ただし、に追加myLib.hするmain.cppだけでは、そこでAまたはBオブジェクトを使用するのに十分ではありません。また、その中B.h

#inlude myLib.h

void someMethod()
{
//field is instance of A
  this.field.otherMethod();
}

A.hAのメソッドはではなく、で宣言されているため、エラーが発生しますmyLib.h

長く絡み合った質問でごめんなさい。

4

2 に答える 2

2

A.hB.h、のそれぞれで個別のインクルード ガードを使用する必要がありますC.h

// Note: not a good name for a guard macro (too short)
#ifndef _A_H
#define _A_H
    // definition of A
#endif

そして、MyLib.h単純になります:

#include<A.h>
#include<B.h>
#include<C.h>

もちろん、各ヘッダーは、必要なだけ他のヘッダーを手動でインクルードして、独立できるようにする必要があります(たとえば、誰かが直接インクルードした場合にコードがコンパイルされるようC.hにインクルードする必要があります)。B.hC.h

場合によっては、前方宣言で十分なため、1 つのヘッダーに別のヘッダーを含める必要はありません。たとえばB.hA*メンバーが宣言されている では、次のようになります。

#ifndef _B_H
#define _B_H
class A;

class B
{
   A* field;
};
#endif
于 2012-07-06T08:11:13.087 に答える
2

パターンを使用する以外に

#ifndef _A_H
#define _A_H

   ... Stuffs

#endif

各ヘッダーに、常に追加します

#ifndef _A_H
#include <A.h>
#endif
#ifndef _B_H
#include <B.h>
#endif
....

のような他のヘッダーにmyLib.h。低レベルヘッダーが既にスキャンされている場合、コンパイラはそれらをロードしてスキャンする必要がないため、これによりコンパイル速度が大幅に向上します。

cpp のヘッダーの数は通常妥当ですが、ヘッダー間の関係を追跡するのははるかに難しいため、これを cpp ファイルに追加しません。

于 2012-07-06T08:17:56.083 に答える