c++ - 具有不同成员变量的多个 Action 的通用类

标签 c++ class oop

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

例如,Command 类定义了一个“enum Action”,它定义了要运行的命令。如果是 start,它存储一个 int 和一个 char*,如果它是类似“setResolution”的东西,它存储两个 int:width 和 height。

我希望此类能够表示任何命令,但我不确定实现此目的的最佳 OO 方法是什么。我的 OO 很生疏,我似乎找不到不涉及继承的解决方案。谢谢。

最佳答案

您描述的内容听起来很像使用 std::function 的组合功能和 std::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();
}

关于c++ - 具有不同成员变量的多个 Action 的通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433356/

相关文章:

android - 使用 ANativeWindow 的 SurfaceTexture/Surface 映射

c# - 从类上的 void 获取字符串值无法正确输出

python - 访问一个类的对象以查看它是否存在于另一个类中

c++ - C++中的包装器设计

c++ - 如何计算运行C++程序的实际操作数?

class - 导入 haskell 模块说 "not in scope"

jquery - 使用 jQuery 通过 ID 名称查找类

java - 卡组的面向对象设计 - 如何使其灵活地在未来拥有更多的卡

php - 了解 php 引用和静态

c++ - 监控自身进程的内存使用情况