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