gpt4 book ai didi

c++ - 将 pimpl 参数传递给 pimpl 对象

转载 作者:行者123 更新时间:2023-11-30 05:49:09 27 4
gpt4 key购买 nike

我有两个实现 PIMPL 的类:State 和 StateMachine。

它们实现了 Private::State 和 Private::StateMachine。

Private::StateMachine 有一个“addState(Private::State &)”方法。我想将 addState() 方法写入其 PIMPL 类,以便执行

StateMachine machine;
State state;

machine.addState(state);

如何将 State 中的对象 Private::State 传递给 StateMachine 中的 Private::StateMachine?

状态机.h

#include <memory>

class State;
namespace Private {
class StateMachine;
} // namespace Private

class StateMachine
{
public:
StateMachine();
~StateMachine();

// want to add this
void addState(const State &state);

private:
std::unique_ptr<Private::StateMachine> m_stateMachine;
};

状态.h

#include <memory>

namespace Private {
class State;
} // namespace Private

namespace StateMachine {

class State
{
public:
State();
~State();

private:

std::unique_ptr<Private::State> m_state;
};

最佳答案

这个问题可能有无数种答案。

以下是一些可以指导您思考的问题:

  1. 复制一个State应该是什么效果?目的?应内部Private::State也被复制?
  2. 是否应该禁止复制(更喜欢移动)?在这种情况下,您需要转储用户定义的构造函数,让编译器为您生成移动。
  3. 假设 (2),您的 Private::StateMachine 应该正在存储 unique_ptr<Private::State>unique_ptr<State> ?这变得很棘手,因为如果你想在 pimpl 后面的状态和机器之间直接交互,你可能想要存储一个 unique_ptr<Private::State>避免在 ::State 中暴露私有(private)操作界面。如果您想交付 State回到用户代码,那么你将不得不重建 ::State处理。这可能会争论 ::State 的非拥有版本.
  4. 使用 pimpl 的目的是什么? State的想法是是 Private::State 的句柄?拥有“空句柄”的概念是否合理(例如作为移动的结果)? 2 个句柄是否应该在复制期间共享相同的状态(为 shared_ptr 争论)?等等。

总之,有一个答案,但这完全取决于 StateMachine、State 的概要以及它们在用户代码中所需的交互。我建议您从这里开始 - 设计用例并观察它们对复制、移动、分配等的影响。这应该会让您自然而然地实现。

关于c++ - 将 pimpl 参数传递给 pimpl 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27901411/

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