所以这就是我的困境:
我有一个基类(比方说一个通用的Person类):
class Person{
public:
Person();
~Person();
virtual void Init();
virtual void SaySomething();
};
现在我想让其他类继承这些方法。
class Worker: public Person{
public:
Worker();
~Worker();
void Init(){
// would do some special initializing.
}
void SaySomething(){
// Print something about the worker.
}
};
现在我有一个经理班:
class Manager{
public:
void Init();
void Run();
void SwitchPerson(Person* p);
protected:
vector<Person*> people;
};
我给出的一个例子是一个人的子类可能不是最好的。但关键不在于类的内容,而是继承,更具体地说是类如何理解和了解其他类。
现在在我的主要功能中我会有以下内容:
int main()
{
Manager* m = new Manager();
m->Init();
// Create a new worker;
Person* w = new Worker();
m->SwitchPerson(w);
return 0;
}
现在我不确定这是否是解决问题的正确方法。问题是可以有无限量的子类,而经理类无法了解它们。 manager类只知道父(Person)类。因此,SwitchPerson会向向量添加类型为Person的新Worker类(现在我不确定这是否在结构上不正确,我有一种感觉。)。但首先需要确保向量中已经没有Worker Classes。我尝试使用typeid.name,但这显然会返回父(Person)类的名称。
我想过使用带有向量的模板..但是再次要求经理类知道Worker或任何其他子类。
如果您需要我解释其他任何内容或添加任何相关信息,请告诉我。
编辑:
注意:人员,工人和经理这两个词是无关紧要的。对于所有重要事项,它可能是相机,镜头和舞台。
SwitchPerson:
假设只有一个人可以同时活跃。使用相机,镜头和舞台类比会更有意义。由于只有一台摄像机可以进入屏幕,所以可以说。
让我们说我们一直在使用相机类比。我们有第一个场景,我们首先调用SwitchCamera()并传入新的Camera。但问题是Stage对象(将是经理)不了解镜头或不同类型的镜头。可能有100或10000.没关系。场景只知道相机是所有镜头类的基类。
因此,当我们切换相机()时,我们可以利用该物体来控制镜头(不是很现实,不管是什么)。所有控件首先作为Camera基类内的虚拟成员实现。所以镜片类都有相同的成员。
现在您已完成第一个场景并想再次切换相机。您将再次调用SwitchCamera()并传入新的第二个摄像头。在切换摄像机中,目标是将传递的摄像机对象设置为活动摄像机,然后将其推送到矢量。
但是我们不想要两个相同镜头的副本。这就是问题所在。我希望能够检查传入的Camera * camera = new Lense123();已经在向量中。如果是,那么我想使用原来的那个并丢弃新传递的那个。
答案 0 :(得分:3)
听起来你希望Manager有一个唯一人的载体,即你可以拥有一个Worker,一个Person和一个ThirdPerson,但不能超过vector中的每一个?为什么不在Person中重载一个函数,该函数返回子类的字符串标签,并遍历为每个函数调用pPerson-&gt; GetLabel()的向量,并将其与您想要添加的新对象的标签进行比较向量。
管理器仍然只知道Person类,不必知道有关Person的不同子类的任何信息,但可以从每种类型中获取唯一的字符串。
答案 1 :(得分:0)
经理是个人,而不是经理有人。我会从Person继承经理,经理有1 ... N个员工,所以最好的办法是: 从Person继承管理器 在Manager中有一个向量。 我会把类Person变为虚拟,所以没有人可以实现“人”