所以这是我的困境:
我有一个基类(比方说一个通用的 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;
};
我给出的 Worker 是 Person 的子类的例子可能不是最好的。但重点不在于类的内容,而在于继承,更具体地说,类如何理解和认识其他类。
现在在我的主函数中我将具有以下内容:
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 类添加到 vector 中(现在我不确定这在结构上是否不正确,我有一种感觉。)。但首先它需要确保 vector 中没有 Worker 类。我尝试使用 typeid.name 但这显然返回父(Person)类的名称。
我想过使用带有 vector 的模板..但这又需要管理器类了解 Worker 或任何其他子类。
如果您需要我解释任何其他内容或添加任何相关信息,请告诉我。
编辑:
注意:术语“人员”、“ worker ”和“经理”是不相关的。重要的可能是相机、镜头和舞台。
切换人:
假设一次只能有一个人处于事件状态。通过相机、镜头和舞台的类比就更有意义了。因为只有一台摄像机可以进入屏幕,所以可以这么说。
假设我们继续使用相机类比。我们有了第一个场景,我们首先调用 SwitchCamera() 并传入新的相机。但问题是舞台对象(即管理器)不了解镜头或不同类型的镜头。可能有100个,也可能有10000个。这并不重要。场景只知道相机,它是所有镜头类的基类。
因此,当我们 switchCamera() 时,我们可以利用该对象来控制镜头(不是很现实,但无论如何)。所有控件首先作为 Camera 基类内的虚拟成员实现。因此,镜头类都具有相同的成员。
现在您已经完成了第一个场景并想要再次切换相机。您将再次调用 SwitchCamera() 并传入新的第二个相机。在切换相机中,目标是将传递的相机对象设置为事件相机,然后将其推送到 vector 。
但我们不想要相同镜头的两个拷贝。这就是问题所在。我希望能够检查是否传入了 Camera*camera = new Lense123();已经在 vector 内部。如果是的话我想使用原来的并丢弃新通过的。
最佳答案
听起来您希望 Manager 有一个由唯一人员组成的 vector ,即您可以有一个 Worker、一个 Person 和一个 ThirdPerson,但 vector 中每个人不能超过一个?为什么不直接在 Person 中重载一个函数,该函数返回子类的字符串标签,并遍历 vector ,为每个 vector 调用 pPerson->GetLabel() ,并将其与您想要添加到 vector 中的新对象的标签进行比较.
Manager 仍然只了解 Person 类,不必了解 Person 的不同子类,但可以从每种类型中获取唯一的字符串。
关于C++ 虚拟继承、类可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11026450/