gpt4 book ai didi

c++ - 使用 shared_ptr 开发可靠的命令模式

转载 作者:搜寻专家 更新时间:2023-10-31 01:19:46 24 4
gpt4 key购买 nike

我正在尝试在库中实现一个非常干净的命令模式。

我现在有以下结构(一些部分仍在完善中):

  1. 用户(客户端代码)有一些对象,称之为“经理”
  2. Manager持有 shared_ptr<Foo> 的集合
  3. Manager通过返回 shared_ptr<Foo> 提供对集合的访问
  4. 我有一个 Command抽象类和用于在 Foo 上执行操作的命令层次结构
  5. 客户端代码不应调用Command::execute() , 只有 Manager 应该Manager::execute(shared_ptr<Command>) ,以便它可以处理撤消/重做

我愿意遵守以下规则:

  1. 用户(客户端代码)有一些对象,称之为“经理”
  2. Manager持有 shared_ptr<Foo> 的集合
  3. Manager通过返回 shared_ptr<const Foo> 提供对集合的访问
  4. 我有一个 Command抽象类和用于在 Foo 上执行操作的命令层次结构
  5. 客户端代码不能(没有解决方法)调用 Command::execute() , 只有 Manager 可以Manager::execute(shared_ptr<Command>) ,以便它可以处理撤消/重做并获取非常量智能指针
  6. A Manager必须能够允许 Command要访问和修改的对象 shared_ptr<Foo>即使用户初始化 Command反对 shared_ptr<const Foo>

我只是想找出处理分发 shared_ptr<const Foo> 的最佳方法同时允许数字 5 和 6 工作。

有没有我可以学习的示例/设计模式?与我已经拥有/正在从事的工作相比,这是一个好主意吗?

最佳答案

我觉得这个 passkey pattern 应该是适合你的:

class CommandExecuteKey{
private:
friend class Manager;
CommandExecuteKey(){}
};

class Command{
public:
// usual stuff
void execute(CommandExecuteKey);
};

class Manager{
public
void execute(Command& cmd){
// do whatever you need to do
cmd.execute(CommandExecuteKey());
}
};

现在,CommandManager一无所知,仅关于 execute 所需的 key 功能。用户将无法调用 execute直接方法,仅作为Manager可以创建CommandExecuteKey对象,感谢私有(private)构造函数和 friend船。

int main(){
Command cmd;
Manager mgr;
//cmd.execute(CommandExecuteKey()); // error: constructor not accessible
mgr.execute(cmd); // works fine, Manager can create a key
}

现在,对于你的第 6 点:
当您输入命令时,搜索所有 shared_ptr<Foo> s 用于正确的对象(使用命令的保存 shared_ptr 作为搜索键),然后从内部 shared_ptr 传递该可变对象回到命令。

关于c++ - 使用 shared_ptr 开发可靠的命令模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758256/

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