我有一个名为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
不会导致实例化。我将它留在我的代码中,因为它显示了我的意图。
如何自动实例化每个实现?有可能吗?
答案 0 :(得分:1)
添加static
成员不会导致生成实例,它只是声明此类型具有“全局”变量。你从来没有真正定义过这些成员,所以如果你试图将它们用于任何你会遇到链接器错误的东西。你必须实际实例化一个对象并注册它。
一种解决方案可能是简单地要求每个派生类型在启动时注册实例。这显然很容易完成,因为我展示了here。 (注意我将您的全局移动到静态函数的静态局部。这可以防止您尚未遇到的几个问题,包括为全局提供“所有者”。)
<小时/> 与您的问题无关,您的代码存在问题:
dynamic_cast<Base*>
没有任何理由。ID
成员。 答案 1 :(得分:0)
当然,矢量是空的,你永远不会添加任何东西。由于您从未创建任何对象实例,因此不会调用派生类的构造函数。
仅仅因为你有静态成员并不意味着会创建任何对象实例。它只是保证不同实例之间的值相同。
您必须显式创建类的实例才能调用构造函数。