我正在尝试创建一个将输入字符串链接到类的结构数组,如下所示:
struct {string command; CommandPath cPath;} cPathLookup[] = {
{"set an alarm", AlarmCommandPath},
{"send an email", EmailCommandPath},
{"", NULL}
};
它的用法如下:
CommandPath *cPath = NULL;
string input;
getline(cin, input);
for(int i = 0; cPathLookup[i] != ""; i++) {
if(cPathLookup[i].command == input)
cPath = new cPathLookup[i].cPath;
}
显然,这段代码是没有意义的,但是我想我的意图很明显-根据输入,我希望将cPath初始化为新的AlarmCommandPath或新的EmailCommandPath。我可以用一个函数根据输入返回一个实例来处理它,但是整个ifs序列看起来并不优雅。
我还应注意,如果它不是很明显且不重要,则AlarmCommandPath和EmailCommandPath是从CommandPath派生的,而CommandPath是抽象类。
谢谢你尽你所能的帮助。
编辑:我只是注意到,尽管CommandPath是抽象的,但我有一个声明:
CommandPath *cPath = NULL;
在工作代码中。为什么编译?
最佳答案
AlarmCommandPath和EmailCommandPath源自COmmandPath,对吗?
在这种情况下,您无法将AlarmCommandPath / EmailCommandPath实例分配给CommandPath-从技术上讲这是可能的,但它不会做您想做的事情。实例
不管您分配了什么,CommandPath都将仍然是CommandPath的实例(它将具有CommandPath的虚拟功能表)。
您需要使用工厂方法(该函数将返回CommandPath *)。像这样:
struct A{
};
struct B: public A{
};
struct C: public A{
};
A* factoryA(){
return new A();
}
A* factoryB(){
return new B();
}
A* factoryC(){
return new C();
}
typedef A* (*FactoryMethod)();
struct{
const char* command;
FactoryMethod factoryMethod;
} factoryTable[] = {
{"A", factoryA},
{"B", factoryB},
{"C", factoryC},
{0,0}
};
关于c++ - C++中的类查找结构数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2839470/