C ++派生类的自动实例化

时间:2013-07-01 18:12:27

标签: c++ instantiation derived-class

我有一个名为Base的抽象基类,其他程序员可以编写实现。在应用程序的其他部分,我想捕获已编写的所有实现并构造每个实例。如果这可以在“实施Base”之外没有其他指令的情况下完成,那将是美好的。但是,我在下面的代码要求每个实现注册自己。它也不起作用。

#include <iostream>
#include <vector>

class Base;

std::vector<Base*>* registrationList = new std::vector<Base*>;

class Base {
public:
   Base(){}
   virtual void execute() = 0;
};

class ImplementationOne: public Base {
public:
   ImplementationOne(){registrationList->push_back(this);}
   void execute(){std::cout << "Implementation One." << std::endl;}
   static int ID;
};

class ImplementationTwo: public Base {
public:
   ImplementationTwo(){registrationList->push_back(this);}
   void execute(){std::cout << "Implementation Two." << std::endl;}
   static int ID;
};

int main(int argc, const char * argv[]){
   std::cout << "Registration List size: " << registrationList->size() << std::endl;
   for(auto it = registrationList->begin() ; it != registrationList->end() ; ++it){
      (dynamic_cast<Base*>(*it))->execute();
   }
   return 0;
}

我得到了一个输出:Registration List size: 0,所以很明显实现从未实例化过。很明显,这不会发生,但我是初学者,这是我能想到的最好的。我假设static int ID;会强制实现每个实现,然后自己注册。我可以看到static不会导致实例化。我将它留在我的代码中,因为它显示了我的意图。

如何自动实例化每个实现?有可能吗?

2 个答案:

答案 0 :(得分:1)

添加static成员会导致生成实例,它只是声明此类型具有“全局”变量。你从来没有真正定义过这些成员,所以如果你试图将它们用于任何你会遇到链接器错误的东西。你必须实际实例化一个对象并注册它。

一种解决方案可能是简单地要求每个派生类型在启动时注册实例。这显然很容易完成,因为我展示了here。 (注意我将您的全局移动到静态函数的静态局部。这可以防止您尚未遇到的几个问题,包括为全局提供“所有者”。)

<小时/> 与您的问题无关,您的代码存在问题:

  • 几乎没有任何理由指向容器。
  • 您是从没有虚析构函数的类型中以多态方式派生的。
  • dynamic_cast<Base*>没有任何理由。
  • 每个派生类声明但未定义 ID成员。

答案 1 :(得分:0)

当然,矢量是空的,你永远不会添加任何东西。由于您从未创建任何对象实例,因此不会调用派生类的构造函数。

仅仅因为你有静态成员并不意味着会创建任何对象实例。它只是保证不同实例之间的值相同。

您必须显式创建类的实例才能调用构造函数。