いくつかのメンバーと関数を提供し、上書きする必要があるアプリケーションのコンポーネントの基本クラスがあり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()
{
}
};
では、派生クラスのコンストラクターを呼び出す前に、基本クラスのメンバーが確実に初期化されるようにするにはどうすればよいでしょうか?