gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:52:44 24 4
gpt4 key购买 nike

我有一个名为 Base 的抽象基类,其他程序员将为其编写实现。在应用程序的其他部分,我想捕获所有已编写的实现并为每个构建一个实例。如果除了“implement 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 不会导致实例化。我将它留在我的代码中,因为它显示了我的意图。

我可以做些什么来获得每个实现的自动实例化?可能吗?

最佳答案

添加static成员不会导致生成实例,它只是声明此类型具有“全局”变量。但是,您实际上从未定义过这些成员,因此如果您尝试将它们用于任何事情,就会出现链接器错误。您必须实际实例化一个对象并注册它。

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


与您的问题无关,您的代码有问题:

  • 几乎没有任何理由需要指向容器的指针。
  • 您正在从没有虚析构函数的类型中进行多态派生。
  • dynamic_cast<Base*>没有明显的原因。
  • 您的每个派生类都声明但不定义 ID成员。

关于C++ 派生类的自动实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17410942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com