我的应用程序的组件有一个基类,它提供了一些成员和功能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()
{
}
};
那么如何确保在调用派生类的构造函数之前初始化基类成员呢?