C++ 太多具有相同概念的类

C++ 太多具有相同概念的类,c++,class,interface,C++,Class,Interface,我有5个用作运算符的类: TurnOn , TurnOff , PushBox , Exit , Enter 对于每种类型,我都有一个字符串,其中包含该类型的描述 例如: class Places { enum Type { Room1 ,Room2 ,Room3 ,Room4 }; // more stuff }; TurnOn turnOn(Places::Room1); string turnOnString = "TurnOn(Room1)" ; 我想将信息存储在地图中,因此

我有5个用作运算符的类:

TurnOn , TurnOff , PushBox , Exit , Enter
对于每种类型,我都有一个字符串,其中包含该类型的描述

例如:

class Places {

enum Type { Room1 ,Room2 ,Room3 ,Room4 };


// more stuff

};
TurnOn turnOn(Places::Room1);
string turnOnString = "TurnOn(Room1)" ;
我想将信息存储在地图中,因此每个操作员有5张地图:

map <string , TurnOn > opeatorTurnOn;
map <string , TurnOff > opeatorTurnOff ;
map <string , PushBox > opeatorTPushBox ;
map <string , Exit > opeatorExit ;
map <string , Enter > opeatorEnter ;
地图操作;
地图操作程序关闭;
地图操作按钮盒;
映射Operatorexit;
地图出租人;
但现在我有5个相同概念的映射:一个带操作符的字符串


如何将操作符存储在一个映射中,这样我就不必持有5个具有相同概念的映射

使它们都从一个基类继承,存储指向基类的指针并使用多态性。

您不能在映射(或任何其他STL容器)中存储异构数据类型

最简单的修复方法是从一个基类中将它们全部子类化,并将基类存储在地图中

编辑:我没有注意到避免多态性的愿望(尽管我真的不明白为什么)。无论如何,我认为boost::any或boost::variant可能会对您有所帮助。您可以将它们全部存储为boost::any。
boost::variant
通常用于此类操作。

这取决于操作符类的实现方式(我们的信息很少),但我会制作一个可调用的映射,类似于以下内容:

#include <iostream>
#include <functional>
#include <map>

struct op1
{
    void operator()(int i) { std::cout << "op1::operator() " << i << "\n"; }
};

struct op2
{
    void operator()(int i) { std::cout << "op2::operator() " << i << "\n"; }
};

int main()
{
    std::map<std::string, std::function<void(int)>> ops;
    ops["1"] = op1{};
    ops["2"] = op2{};
    ops["1"](42);
    ops["2"](42);
}
#包括
#包括
#包括
结构op1
{

void operator()(int i){std::我是否希望避免多态性,因为每个类都有不同的方法。您可以有一个polymorhpic入口点(例如,
func()
)在这种情况下,您将确切地知道类的类型以及存在的whap可用操作。参见其他答案,他指定他不想要一个基类。这似乎是一个有缺陷的设计,5个运算符类不是从基类派生的
运算符
?从b派生所有按钮更有意义ase类并在预定义的数字出现时在整个程序中动态创建新运算符。例如,
operator*turnOn=new turnOn;
@Need4Sleep:(1)这应该是一个答案。(2)我将尝试修复我的设计。谢谢!为什么要否决?鉴于目前已知的设计信息,这似乎是一个非常有效的答案。我也这么认为-1-因为太多的推动(为什么要否决?不是吗?)。