我有一个非常简单的 C++ 查找表用于调度命令:
template <class T> Action* CreateAction(Command *c)
{
return new T(c);
}
typedef Action* CreateActionFunc(Command *c);
typedef struct ActionTable {
string name;
CreateActionFunc *func;
} ActionTableEntry;
vector<ActionTableEntry> GlobalActionTable = {
{ "quit" , &CreateAction<DoQuit> },
};
这工作正常,但我宁愿让我的 CreateAction 函数在堆栈上构造新对象并按值返回它。但是当我写这个时:
template <class T> T CreateAction(Command *c)
{
return T(c);
}
typedef Action CreateActionFunc(Command *c);
然后程序将不再编译。首先,我收到无法实例化抽象类的错误(在 typedef 行上),还收到表的初始化列表与 vector 类型不匹配的错误。
有一个非常相似的问题here但是每个答案都在工厂方法中使用 new
,这显然是我要避免的。如何做到这一点?
最佳答案
不能按值对对象使用多态性。 需要得到指点或引用。 我猜这里你有一个 Action 接口(interface)(所以是一个抽象类),所以你不能创建这种动态类型的对象。您所能做的就是发送一个类型为派生类的动态类型的 Action 指针(所以我假设您已经在做)。 您可以在堆栈上创建一个派生类型的值对象并返回对基类的引用并仍然使用多态性,但是您需要解决派生对象的生命周期问题。
关于c++ - 子类查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24063667/