2015-01-12 2 views
1

저는 PIMPL을 구현하는 두 가지 클래스 인 State와 StateMachine을가집니다.pimpl 인수를 pimpl 객체에 전달하십시오.

그들은 Private :: State 및 Private :: StateMachine을 구현합니다.

Private :: StateMachine에는 "addState (Private :: State &)"메서드가 있습니다. 나는 머신 (StateMachine) 내에서 개인 :: 머신 (StateMachine)에 주에 여드름 투성이의 객체 개인 :: 상태를 전달할 수있는 방법

StateMachine machine; 
State  state; 

machine.addState(state); 

을하기 위해, 자사의 PIMPL 클래스에 addState() 메소드를 작성하려면?

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

아마이 질문에 대한 답변의 무제한 수 있습니다.

  1. 는 무엇 State 객체를 복사하는 효과가 있어야한다 :

    여기에 당신의 생각을 안내하는 몇 가지 질문은? 내부 Private::State도 복사해야합니까?

  2. 사본을 허용하지 않아야합니까 (선호합니까?)? 어떤 경우에는 컴파일러가 동작을 생성 할 수 있도록 사용자 정의 생성자를 덤프하려고합니다.
  3. (2)로 가정하면 Private::StateMachineunique_ptr<Private::State> 또는 unique_ptr<State>을 저장해야합니까? 당신이 핌플 뒤에있는 상태와 기계 사이의 직접적인 상호 작용을 원한다면 을 저장하여 ::State 인터페이스에서 비공개 작업을 피할 수 있기 때문에 까다로운 일이 발생합니다. State을 사용자 코드로 다시 전달하려면 ::State 핸들을 다시 만들어야합니다. 이는 비 소유 버전 인 ::State을 주장 할 수 있습니다.
  4. pimpl 사용의 목적은 무엇입니까? StatePrivate::State의 핸들입니까? 'null handle'개념을 갖는 것이 합리적입니까 (예 : 이동 결과)? 복사 중에 두 개의 핸들이 같은 상태를 공유해야합니까 (shared_ptr에 대한 주장)? 등등.

요약하면 답변은 있지만 StateMachine, State 및 원하는 사용자 상호 작용의 개요에 따라 달라집니다. 거기서 시작할 것을 제안합니다 - 사용 사례를 디자인하고 복사, 이동, 할당 등에 대한 효과를 관찰하십시오. 그러면 자연스러운 구현으로 이어질 것입니다.

+0

'StateMachine'과'State'는 복사 할 수 없습니다. pimpl로 클래스 구현을 숨기고 싶습니다. 이 경우 – Jepessen

+0

에 addState()를 주었던 상태로 무엇을해야합니까? 'Private :: State' impl에서 무언가를 복사합니까? –

+0

아니요. Private :: State의 일부 속성을 읽고 복사하거나 이동하지 않고 몇 가지 작업을 수행해야합니다. – Jepessen

관련 문제