我有两个实现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;
};
答案 0 :(得分:1)
这个问题可能有无限数量的答案。
以下是一些指导您思考的问题:
State
对象会产生什么影响?内部Private::State
是否也应该被复制?Private::StateMachine
应该存储unique_ptr<Private::State>
还是unique_ptr<State>
?这很棘手,因为如果你想在pimpl后面的状态和机器之间进行直接交互,你可能想要存储unique_ptr<Private::State>
以避免在::State
接口中暴露私有操作。如果您希望将State
发送回用户代码,则必须重建::State
句柄。这可能是::State
。State
是Private::State
的句柄的想法吗?拥有“空句柄”的概念是否合理? (例如,移动的结果)? 2副句在副本期间是否共享相同的状态(争论为shared_ptr)?等等。总之,有一个答案,但它完全取决于StateMachine,State及其在用户代码中所需的交互的概要。我建议你从那里开始 - 设计用例并观察它们对复制,移动,赋值等的影响。这应该会引导你进行自然的实现。