【问题标题】:C++ Store a function from a member class property in another classC ++将成员类属性中的函数存储在另一个类中
【发布时间】:2021-12-20 20:22:16
【问题描述】:

我正在编写一个在 2D 瓷砖集上运行的小游戏。这个想法是会有一些单元格(位置 X,位置 Y),如果玩家踩到,它将触发一个事件,所以我创建了一个 map<cell_position, function to trigger>

问题是这个函数将在 World 类中,包含 Npc 成员,我想将 Npc 公共函数 teleport 存储为地图中的值,我可以显示在下一个sn-p:

std::unordered_map<std::pair<int, int>, std::function<void()>> actionCells =
 { std::make_pair(10, 1), std::bind(mPlayerNpc->teleport, 3, 3)) };

这可能吗?因为我遇到了下一个错误:

错误:无效使用非静态成员函数 'void Npc::teleport(int, int)'

---编辑-----------------------------------

如果我不想使用 Lambda,是这样完成的吗?

std::unordered_map<std::pair<int, int>, std::function<void()>> actionCells =
   { std::make_pair(10, 1), [&]() {mPlayerNpc->teleport(3, 3); } };

【问题讨论】:

  • mPlayerNpc.teleport 没有正确描述实例 teleport 需要被调用。您需要更像&amp;TYPE::teleport, &amp;mPlayerNpc 的东西来指定被调用的函数和实例。也就是说,请考虑使用Lambda expression 而不是std::bind。 Lambda 通常更容易处理并且运行时开销更少。
  • 是的,这是可能的。将std::bind 与非静态成员一起使用时,您需要一个实例来通过引用、地址或占位符(如果需要)进行绑定。你没有做任何这些。
  • @user4581301 我已经编辑了帖子,并添加了如何使用 lambda 表达式。你有什么例子吗?
  • 你的问题完全是关于如何使用std::bind调用成员函数,这在stackoverflow.com/questions/37636373/…等大量问题中得到了解答

标签: c++


【解决方案1】:

将类实例传递给std::bind 应该可以工作。比如:

std::unordered_map<std::pair<int, int>, std::function<void(int x, int y)>> actionCells =
 { std::make_pair(10, 1), std::bind(&ActualClassNameOfPlayerNpc::teleport, mPlayerNpc 3, 3)) };

【讨论】:

  • 公平警告:这将针对 mPlayerNpc 调用复制语义。如果这是不可取的,并且范围管理规定了它,请通过地址传递或将实例隐藏在引用包装器中,并警惕 mPlayerNpc 的生命周期。
  • 是的,请注意。我假设它是一个指针。
  • 由于错误信息,我们可以假设mPlayerNPc的类名实际上是Npc吗?
  • 我把它改成了ActualClassNameOfPlayerNpc,因为我们不知道实际的类名是什么。所以你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多