将pimpl参数传递给pimpl对象

时间:2015-01-12 11:55:35

标签: c++ argument-passing pimpl-idiom

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

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

Private :: StateMachine有一个" addState(Private :: State&)"方法。我想将addState()方法编写到其PIMPL类中,以便执行

StateMachine machine;
State        state;

machine.addState(state);

如何在StateMachine中向Private :: StateMachine传递State ::状态中的对象Private :: State?

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;
};

State.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 个答案:

答案 0 :(得分:1)

这个问题可能有无限数量的答案。

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

  1. 复制State对象会产生什么影响?内部Private::State是否也应该被复制?
  2. 是否应该禁止复制(更喜欢移动)?在这种情况下,您将要转储用户定义的构造函数,以允许编译器为您生成移动。
  3. 假设(2),您的Private::StateMachine应该存储unique_ptr<Private::State>还是unique_ptr<State>?这很棘手,因为如果你想在pimpl后面的状态和机器之间进行直接交互,你可能想要存储unique_ptr<Private::State>以避免在::State接口中暴露私有操作。如果您希望将State发送回用户代码,则必须重建::State句柄。这可能是::State
  4. 的非拥有版本的争论
  5. 使用pimpl的目的是什么?是StatePrivate::State的句柄的想法吗?拥有“空句柄”的概念是否合理? (例如,移动的结果)? 2副句在副本期间是否共享相同的状态(争论为shared_ptr)?等等。
  6. 总之,有一个答案,但它完全取决于StateMachine,State及其在用户代码中所需的交互的概要。我建议你从那里开始 - 设计用例并观察它们对复制,移动,赋值等的影响。这应该会引导你进行自然的实现。