具有不同成员变量的多个操作的泛型类

时间:2013-07-02 18:42:35

标签: c++ class oop

我正在尝试定义一个整体类,称之为“Command”,它可以采用“枚举动作”来定义要运行的命令。我想让这个类代表任何可能的命令(存储每个命令的变量),但我不想为从一般Command类继承的每个命令定义一个类。

例如,类Command定义了一个“枚举动作”,它定义了要运行的命令。如果它是start,它存储一个int和一个char *,如果它类似于“setResolution”,它存储两个int:width和height。

我希望这个类能够代表任何命令,但我不确定什么是最好的OO方法来实现这一目标。我的OO非常生疏,我似乎无法找到不涉及继承的解决方案。谢谢。

1 个答案:

答案 0 :(得分:2)

您所描述的内容听起来很像使用std::functionstd::bind的组合功能。使用这些创建一个可调用的函数对象,该对象存储需要传递的所有参数,同时允许您在不知道任何特定细节的情况下执行调用。它适用于成员函数和自由函数。您可以将Command类更改为描述需求的简单包装器。

以下示例使用自由函数执行此操作。 Command类不关心参数或它们的类型。它所关心的只是命令本身的发送方式。

#include <iostream>
#include <functional>
#include <string>

class Command
{
public:
    Command(const std::string& name, const std::function<void()>& func)
        : name_(name), func_(func) {}

    Command(const Command& o) : name_(o.name_), func_(o.func_) {}

    void operator()()
    {
        std::cout << "executing " << name_ << std::endl;
        func_();
    };

    const std::string name() const { return name_; }

private:
    Command& operator=(const Command&);

    const std::string           name_;
    const std::function<void()> func_;
};

void start(int a, const char* b)
{
    std::cout << "start(" << a << "," << b << ")" << std::endl;
}
void setResolution(int a, int b)
{
    std::cout << "setResolution(" << a << "," << b << ")" << std::endl;
}

int main()
{
    Command start("start", std::bind(start, 1, "hello world"));
    Command setRes("setRes", std::bind(setResolution, 640, 480));

    start();
    setRes();
}