2017-01-16 5 views
0

이 질문은 여기이 질문의 후속 질문 enable_shared_from_this : original question자체는

나는 std::enable_shared_from_this에서 상속 클래스가이 클래스는 std::shared_ptr<Self>

을 포함

이 클래스의 생성자 중 클래스의 세부 정보가 완전하고 성공적이라는 것을 알고 난 후에 std::shared_ptr<Self>shared this에 할당되도록 지정하려면 어떻게해야합니까?

예 :

class Self : public std::enable_shared_from_this<Self> { 
private: 
    std::shared_ptr<Self> me_; // Or 
    std::unique_ptr>Self> me_; 

public: 
    Self (/*some parameters*/); 
}; 

Self::Self(/* some parameters */) { 
    // Check parameters for creation 

    // Some work or initialization being done 

    // If all is successful and construction of this class is about 
    // to leave scope, then set the smart pointer to the this* 

    // How to do ... 
    me_ = std::enable_shared_from_this<Self>::shared_from_this(); 
    // Properly if this is even possible at all. 
} 
+0

@ Jason R 오 그럼. 그래서 나는 그것들의 인스턴스를 포함하는 "manager type class"를 갖도록 요구할 것이다. 또는 나는 구조체 또는 생성 함수와 같은 생성자 바로 다음에 호출되도록 함수에 설정해야 할 것이다. –

+0

자기에 대한 shared_ptr은 모순입니다. 일시적으로 객체를 유지하는 데 유용합니다 (예 : 콜백을 기다리는 중). –

답변

2

당신은 할 수 없습니다. 이 시점에서 현재 Self 인스턴스를 가리키는 shared_ptr이 아직 존재하지 않습니다. 생성자가 반환 될 때까지는 존재할 수 없습니다. shared_from_this()에는 shared_ptr이 이미 존재하며 this을 가리키는 전제 조건이 있습니다.

+0

알겠습니다. 그래서 나는 공유 포인터를 포함하는 관리자 클래스가 필요하거나이 클래스 내에서 create() 또는 init() 메소드와 같은 생성자 이후에 호출되어야하는 메소드를 필요로합니다. –

+0

네, 맞습니다. –

+0

예, 도서관의이 부분을 상속받은 것은 저에게 새로운 것입니다. –

1

현재 개체를 가리키는 기존 std::shared_ptr이어야하므로 사용자가이 작업을 수행 할 수 없습니다. 스콧 마이어스는 효과적인 현대 C에서 말했듯 ++ (19 장), 당신은 개인 당신의 생성자를 선언하고처럼 std::shared_ptr를 반환 공장 기능을 만들 수 :

을 : process를 호출 한 후

class Self: public std::enable_shared_from_this<Self> { 
public: 
// factory function that perfect-forwards args 
// to a private ctor 
    template<typename... Ts> 
    static std::shared_ptr<Self> create(Ts&&... params); 
    ... 
    void process(); 
    ... 
private: 
    ... // ctors 
}; 

그리고, 그와 같은 일을 할 수

void Self::process() 
{ 
    ... 
    me_ = shared_from_this(); 
} 
+0

기술적으로는 가능하다고 생각합니다 (나쁜 설계 일지라도). JasonR의 [answer] (http://stackoverflow.com/a/41683759/3246555)에 대한 내 의견을 참조하십시오. – AlexD