0

いくつかのメンバーと関数を提供し、上書きする必要があるアプリケーションのコンポーネントの基本クラスがありInit()ますUpdate()

class Component
{
public:
    void Set(type* Member1, type* Member2, type* Member3)
    {
        this->Member1 = Member1;
        this->Member2 = Member2;
        this->Member3 = Member3;
    }
    virtual void Init() = 0;
    virtual void Update() = 0;
    virtual ~Component() {}
protected:
    type* Member1;
    type* Member2;
    type* Member3;
};

コンポーネントを処理するために、マネージャーがいます。最初にコンポーネントのメンバーを設定し、次にそれを呼び出しますInit()。後で、割り当てられたすべてのコンポーネントを更新するために使用できますが、それはこの質問には関係ありません。

class Manager
{
public:
    void Add(string Name, Component* Component)
    {
        list[Name] = Component;
    }
    void Init(type* Member1, type* Member2, type* Member3)
    {
        for (auto i = list.begin(); i != list.end(); i++)
        {
            i->second->Set(Member1, Member2, Member3);
            i->second->Init();
        }
    }
    void Update()
    {
        for (auto i = list.begin(); i != list.end(); i++)
            i->second->Update();
    }
private:
    unordered_map<string, Component*> list;
};

関数を上書きする代わりに、コンポーネントのコンストラクターを初期化に使用したいので、実装に満足していませんInit()。しかし、構築時には基本クラスのメンバーはまだ利用できません。

派生クラスのコンストラクターを介してメンバーを渡すことができることはわかっていますが、特定のコンポーネントがその基本クラスのメンバーを気にする必要はありません。それは次のようになりますが、とにかく私はそれを望んでいません。

class Component
{
public:
    Component(type* Member1, type* Member2, type* Member3)
    {
        this->Member1 = Member1;
        this->Member2 = Member2;
        this->Member3 = Member3;
    }
    virtual void Update() = 0;
    virtual ~Component();
protected:
    type* Member1;
    type* Member2;
    type* Member3;
};

class Specific : public Component
{
public:
    Specific(type* Member1, type* Member2, type* Member3) : Component(Member1, Member2, Member3)
    {

    }
    void Update()
    {

    }
};

では、派生クラスのコンストラクターを呼び出す前に、基本クラスのメンバーが確実に初期化されるようにするにはどうすればよいでしょうか?

4

3 に答える 3

1

あなたは本当に選択の余地がありません。派生クラスは基本クラスの初期化のニーズを知っているか(基本クラスはコンストラクター/初期化関数でその情報を必要とするため)、または派生クラスの初期化をコンストラクターから移動する必要があります(基本クラスを初期化した後のクライアント)。

基本クラスに設定する必要のあるメンバーのリストが長い場合は、それらすべてを構造体にパッケージ化して、派生クラスを介して基本クラスに渡すことができます。

于 2013-01-22T15:21:59.570 に答える
0

基本クラス コンストラクターは派生クラス コンストラクターの前に呼び出されるため、基本クラス コンストラクターに値を設定します。

于 2013-01-22T14:56:50.393 に答える
0

ここで何を達成しようとしているのかよくわかりませんが、いくつか観察できます。2 段階の構築を実装しようとしているようです。

まず、基本クラスのコンストラクターを使用する場合は、派生コンストラクターから値を渡す必要があります。言語にはそれを行うための他のメカニズムがないため、それがオプションでない場合 (または少なくとも楽しませたいオプションでない場合) は、追加の外部インターフェイスを使用する必要があります。

最後の質問に答えるために、派生コンストラクターが呼び出される前に、ベースのメンバーは常に初期化されます。Updateたとえば、使用する前にそれらが設定されていることを確認したいと思います。

Init保護を作成し、名前を次のように変更して、関数を呼び出す前に常にセットを実行するSetように強制するのはどうですか。これにより、基本メンバーが設定される前に呼び出すことができなくなり、比較的類似したインターフェイスが得られます。SetAndInitInitInit

于 2013-01-22T15:19:02.773 に答える