0

編集:人々に感謝します、今私は私の間違いを見ます。

私が間違っていなければ、ファクトリメソッドの性質上、循環依存関係があります。

基本クラスはサブクラスを作成するため、サブクラスを知る必要があり、サブクラスは基本クラスを知る必要があります。循環依存を持つことは悪いプログラミング慣行ですよね?

実際に私は工場を実装しました、私は上記の問題を抱えています、私は追加しました

#ifndef MYCLASS_H
#define MYCLASS_H
#endif

私はまだ得ています

Compiler Error C2504 'class' : base class undefined

そして、このエラーは、基本クラスのヘッダーからサブクラスのインクルードを削除すると消えます。

4

4 に答える 4

4

解決策1:派生クラスヘッダーを基本クラスヘッダーに#includeしないでください。基本クラスcppにのみ含めてください。ファクトリメソッドの宣言では、返される具象クラスの型を使用するのではなく、基本型のみを使用する必要があります。

解決策2:別のファクトリクラス(または別のクラス内のファクトリメソッド)を使用してオブジェクトを作成します。その後、循環依存は完全に排除されます。これが推奨される方法です。

于 2010-05-06T13:14:31.993 に答える
4

工場は製品の基本クラスであってはなりません。

于 2010-05-06T13:14:49.590 に答える
1

基本クラスは、派生クラスについて知る必要はありません。

いくつかの異なるパターンを混ぜ合わせている可能性があるため、パターンの説明を再検討する必要があります。派生クラスを作成するためにそれを使用している場合、ファクトリは基本クラスの一部であってはなりません。単一のクラスのさまざまなインスタンスを作成するためだけに使用している場合は、そのクラスの静的メンバーである可能性があります。

上記のエラーメッセージでは、派生クラスは常に基本クラスの完全な実装を知っている必要があります。設計上の問題として、基本クラスは派生クラスについて何も知らないはずです。

于 2010-05-06T13:19:31.500 に答える
0
struct Base {
    Base * Create(int param);
};

struct Derived0 : public Base {
};

struct Derived1 : public Base {
};

Base * Base::Create(int param) {
    switch (param) {
    case 0: return new Derived0();
    case 1: return new Derived1();
}

Baseクラス定義内にファクトリ関数を実装しようとしないでください。そこで宣言し、派生クラスの定義の後に定義するだけです。

于 2010-05-06T13:16:09.740 に答える