我正在尝试为一个项目实现一个产生系统,其中我有一个容器类(在这种情况下它本质上是世界),它可以容纳任何世界对象,其中有几个派生类。
因为容器类具有与派生类的实例化相关的信息(调用spawn方法的外部类不需要),我认为使用模板化成员函数是有意义的,其中函数的类型是被要求被指定为
containerClass.functionName<type>(/*no arguments specifying the type*/);
没有模板化容器类(因为该类包含多种类型的对象)
这可能是我的误解,但是不能从括号之间的值(或者这些&lt;&gt;通常所知的)中获取哪种类型的信息?
以下(简化)代码是我对模板的理解所实现的这个任务:
#include <vector>
#include <iostream>
class baseClass {
public:
virtual const char* getName() { return "baseClass"; }
};
class derivedA : public baseClass {
public:
const char* getName() { return "derivedA"; }
};
class derivedB : public baseClass {
public:
const char* getName() { return "derivedB"; }
};
class container {
public:
container() {}
~container() {
for (int i = 0; i < contained.size(); ++i) {
delete contained[i];
}
}
template <typename type> void spawn() {
contained.push_back(new type(/*in my case the container has data with which to initialize the class*/));
}
void printNames() {
for (int i = 0; i < contained.size(); ++i)
std::cout << contained[i]->getName() << std::endl;
}
private:
std::vector<baseClass*> contained;
};
int main() {
container c;
c.spawn<derivedA>();
c.spawn<derivedB>();
c.spawn<derivedA>();
c.printNames();
return 0;
}
这可以按预期工作(给出原始问题的修改)生成
derivedA
derivedB
derivedA
虽然我还没有在我的实际项目中使用它(这给了我一个链接器错误,说明特定的模板方法不存在),我想知道这是否是有效的C ++和/或一个好的做法。是否有更明智的方法来实现这个目标?
我非常感谢有人解释如何最好地实现这样的功能,最好不要传递未使用的实例。
在较不专业的说明中(我相信一些用户会编辑出来......)我为这个问题的长度道歉。出于同样的原因,我想这可能是一个重复的帖子,我不知道哪个术语可以最好地解释我的情况。如果你以某种方式完成了这一切,我感谢你的耐心!