【问题标题】:Too much classes with the same concept具有相同概念的类太多
【发布时间】:2012-12-14 17:52:18
【问题描述】:

我有 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 ;

但现在我有 5 个具有相同概念的地图:带有操作符的字符串。

如何将运算符存储在一张地图中,这样我就不必保存 5 张具有相同概念的地图?

【问题讨论】:

  • 这似乎是一个有缺陷的设计,5 个不是从基类operator 派生的运算符类?当预定义数字时,从基类派生所有按钮并在整个程序中动态创建新运算符会更有意义。例如operator * turnOn = new TurnOn;
  • @Need4Sleep: (1) 这应该是一个答案。 (2) 我会尝试修复我的设计。谢谢!

标签: c++ class interface


【解决方案1】:

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

#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);
}

如果您不使用 operator() 重载,您也可以始终将操作包装在 lambda 中。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我想避免多态,因为每个类都有不同的方法。
    • 您可以拥有一个多态入口点(例如,func()),一旦进入该上下文,您将确切知道该类是什么类型以及存在哪些可用操作。
    【解决方案3】:

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

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

    编辑:我没有注意到避免多态性的愿望(不过,我真的不明白为什么)。无论如何,我认为 boost::any 或 boost::variant 可能会对你有所帮助。您可以将它们全部存储为 boost::any。 http://www.boost.org/doc/libs/1_52_0/doc/html/any.html

    【讨论】:

    • 查看其他答案,他指定他已经不想要基类了。
    【解决方案4】:

    boost::variant 通常用于此类事情。

    【讨论】:

    • 为什么投反对票?鉴于当前已知的设计信息,这似乎是一个非常有效的答案。
    • 还有我的 -1 - 因为太多的提升(很好的理由不投票 DeadMG 不是吗?)。
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多