C++ 太多具有相同概念的类
我有5个用作运算符的类: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)" ; 我想将信息存储在地图中,因此
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-因为太多的推动(为什么要否决?不是吗?)。