我正在尝试创建一个将输入字符串链接到类的结构数组,如下所示:

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/

10-09 04:33