gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:14:16 26 4
gpt4 key购买 nike

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

例如,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com