2

所以这是我的困境:

我有一个基类(假设是一个通用的 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 类(现在我不确定这是否在结构上不正确,我有一种感觉。)到向量中。但首先它需要确保向量中已经没有 Worker Class。我尝试使用 typeid.name 但这显然返回了父(人)类的名称。

我曾想过使用带有向量的模板.. 但这又需要管理器类了解 Worker 或任何其他子类。

如果您需要我解释其他任何内容或添加任何相关信息,请告诉我。

编辑:

注意:Person、Worker 和 Manager 是无关紧要的。它可以是相机、镜头和舞台。

开关人:

假设一次只能有一个人处于活动状态。使用相机、镜头和舞台类比会更有意义。由于只有一台相机可以进入屏幕,可以说。

假设我们保持相机类比。我们有了第一个场景,我们首先调用 SwitchCamera() 并传入新的 Camera。但问题是舞台对象(即经理)不了解镜头或不同类型的镜头。可能有 100 或 10000。没关系。场景只知道作为所有镜头类的基类的相机。

因此,当我们 switchCamera() 时,我们可以利用对象来控制镜头,比如说(不是很现实,但无论如何)。所有控件首先作为 Camera 基类中的虚拟成员实现。所以镜头类都有相同的成员。

现在您已经完成了第一个场景并想再次切换相机。您将再次调用 SwitchCamera() 并传入新的第二个摄像头。在切换相机中,目标是将传递的相机对象设置为活动相机,然后将其推送到矢量。

但我们不想要相同镜头的两个副本。这就是问题所在。我希望能够检查传入的 Camera* camera = new Lense123(); 已经在向量内。如果是,那么我想使用原始的并丢弃新通过的。

4

2 回答 2

3

听起来您希望 Manager 拥有一个唯一人员的向量,即您可以有一个 Worker、一个 Person 和一个 ThirdPerson,但向量中的每个人不能超过一个?为什么不在 Person 中重载一个函数,该函数返回子类的字符串标签并遍历向量,为每个调用 pPerson->GetLabel() ,并将其与您正在考虑添加到向量中的新对象的标签进行比较.

Manager 仍然只知道 Person 类,不需要知道 Person 的不同子类,但可以从每个类型中获取唯一的字符串。

于 2012-06-14T04:18:52.377 回答
0

经理是一个人,而不是经理有一个人。我会从 Person 继承 Manager,而 Manager 有 1...N 个员工,所以最好的办法是:从 Person 继承 Manager 在 Manager 中有一个向量。我会将 Person 类设为虚拟,因此没有人可以实现“Person”

于 2012-06-14T03:59:23.143 回答