我正在尝试定义一个整体类,称之为“Command”,它可以采用“枚举动作”来定义要运行的命令。我想让这个类代表任何可能的命令(存储每个命令的变量),但我不想为从一般Command类继承的每个命令定义一个类。
例如,类Command定义了一个“枚举动作”,它定义了要运行的命令。如果它是start,它存储一个int和一个char *,如果它类似于“setResolution”,它存储两个int:width和height。
我希望这个类能够代表任何命令,但我不确定什么是最好的OO方法来实现这一目标。我的OO非常生疏,我似乎无法找到不涉及继承的解决方案。谢谢。
答案 0 :(得分:2)
您所描述的内容听起来很像使用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();
}