0

Visual Studio2010を使用してC++プログラムを開発しています。これらのクラス定義とヘッダーファイルがあります:
sh:

class s : oe {
    ...
};

th:

class t : oe {
    ...
};

oe.h:

class oe {
    ...
    o getO();//we reference to class 'o' in oe.h, so we must include o.h begore oe.h
};

& ああ :

class o {
    ...
    s getS();//we reference to class 's' in o.h, so we must include s.h begore o.h 
};

問題は、のクラス'o'を参照しているため、の前にoe.h含める必要があります。また、のクラス' s'を参照しているため、前に含める必要がありますが、needs &needs &needs ! ご覧のとおり、クラスの依存関係のサイクルにはある種のループが存在するため、プロジェクトをコンパイルできません。shとthとoe.hの間の依存関係を削除すると、問題は解決します(これがこの状態の場合です):o.hoe.ho.hs.ho.hs.hoe.hoe.ho.ho.hs.h
stdafx.h

#include "s.h"
#include "t.h"
#include "o.h"
#include "oe.h"

しかし、指定されたすべての依存関係を使用する必要があり、依存関係を削除することはできません。何か案が?

4

2 に答える 2

6

代わりに前方宣言を使用し、実装を実装ファイルに移動することで、これを解決できます。

のヘッダーを含める代わりに、s前方宣言します。

class s;

また、クラスのデータメンバーを除くほぼすべての不完全な型として使用できます。(実装が分離されている場合)。

これは、おそらく、設計である根本的な問題に対処していません。

于 2012-06-28T09:57:52.320 に答える
0

前方宣言は、ポインター/参照だけでなく、戻り値に対しても機能します。

したがって、次のようなことができます。

o.h:

class o;

class oe {
    o getO();
};

oe.cpp:

#include "oe.h"
#include "o.h"

o oe::getO() {
    return o();
}

すすぎ、必要に応じて繰り返します...ファイルに#includes がなくなった.hため、循環的なインクルード依存関係が発生する可能性はありません。

于 2012-06-28T10:04:48.090 に答える