-1

このような単純なオブジェクトファクトリを理解したいと思います。

template <class Base>
class Factory
{
protected:
Factory (std::string name)
...
}
Factory<Base>::Factory (std::string name)
{
        Factory_Map[name] = this;
}
//-------------------------------------
template <class Derived, class Base>
class Factory_Der: public Factory<Base>
{
public:
Factory_Der(std::string name) : Factory<Base>(name) { }
...
};

したがって、Factory_DerのコンストラクターはFactoryのコンストラクターを呼び出します。しかし、 Factoryのコンストラクター内のこのポインターがFactoryオブジェクトまたはFactory_Derオブジェクトを参照するかどうかはわかりません。これはファクトリオブジェクトを参照しているようですが、コードは機能しないはずです。(そしてそれは機能しています)。

ありがとう

4

2 に答える 2

3

まず、オブジェクトを 1 つ作成しましたFactory_Derよね。では、thisポインターはどのオブジェクトを指すのか、どのオブジェクトを指すことができるのかと尋ねると、オブジェクトは 1 つだけFactory_Derです。オブジェクトです。

からFactory_Der継承しているため、オブジェクトFactoryのメモリ レイアウトの一部をFactory_Derオブジェクトとして表示できFactoryます。しかし、それは同じオブジェクトの一部です。Factory指している可能性のある「別の」オブジェクトはどこにもありません。

これらがコンストラクターであるという事実に巻き込まれたようです。ただし、コンストラクターは、メモリ割り当て後のオブジェクト構築中に「自動的に呼び出される」という点を除いて、メソッドと非常によく似ています。このオブジェクトの構造は次のようになると想像できます。

Factory_Der *foo = new Factory_Der;

以下のようなものに変換されます (実際の構文ではありません。ただし、これは Objective-C の方法です)。

Factory_Der *foo = malloc(sizeof(Factory_Der));
foo->constructor();

thisこれは、コンストラクターがオブジェクトを指す理由を説明しています。

すべてのコンストラクターの先頭で、基本クラスとフィールドを初期化する方法を指定するオプションの初期化子リストを指定できます。(何かの初期化子をスキップすると、デフォルトが選択されます。)したがって、基本的に、コンストラクターは最初にスーパークラスのコンストラクターを自動的に呼び出します。

繰り返しになりますが、コンストラクターは次のようになると想像できます。

Factory_Der(std::string name) : Factory<Base>(name) { }

下で次のように変換されます。

void constructor(std::string name) { this->Factory<Base>::constructor(name); }

ご覧のとおり、派生クラスのコンストラクターは基本的に、そのコンストラクターを基本クラスのコンストラクターに「渡します」this。したがって、彼らが見ているオブジェクトthis同じオブジェクトです。

もちろん、基本クラスのコンストラクターが実行されている時点では、派生クラスの状態は設定されていません。そのため、オブジェクトが本当に派生クラス オブジェクトと見なされるかどうかは、議論の問題です。しかし、Factoryコンストラクターthisが参照するオブジェクトが、最終的にオブジェクトになるオブジェクトであるかどうかという質問であればFactory_Der、答えは明確にイエスです。

于 2012-08-20T09:28:10.490 に答える
0

あなたの論理的な問題は、 a がオブジェクトFactory*を指すように制限されていると考えていることです。そのようなポインターは、またはそのサブクラスのいずれかをFactory指すように制限されていますが(それらはs であるため)。この場合、実際にインスタンス化された実際のタイプのオブジェクトを指しています。継承を完全に理解していないように見えるので、継承を本当に読み直す必要があります。FactoryFactorythisFactory_Der

于 2012-08-19T22:22:18.537 に答える