2016-09-15 3 views
0

클래스 B의 인스턴스를 생성하는 메서드를 제공하는 클래스 A이 있습니다. BA에 대한 개인 참조를 보유하며이 참조를 설정하는 생성자를 제공합니다.C++에서 종속 클래스의 수명은?

class A { 
    public: 
    B* construct_B(); 
} 
class B { 
    private: 
    const A& private_A; 
    public: 
    B (const A& my_A): private_A (my_A) { } 
} 

construct_B의 구현 this 통해 자신에게 동적 할당 및 관리 기준을 통과 걸린다.

A의 수명이 B보다 길어서 참조가 유효하도록이 설정을 구현하는 방법은 무엇입니까? 주목할 점은 원시 포인터를 반환하는 대신 construct_B의 모든 가능성에 신경 쓰지 않는다는 것입니다. 스마트 포인터 나 그와 비슷한 것을 반환 할 수 있습니다.

B을 가지고 할 수있는 해결 대신 A에 스마트 포인터를 개최 참조를 유지하고, 대신에 동적으로 B에 정적 참조를 가지고 다음, 그 포인터의 같은 것을 설정하는 construct_B에서 B을 할당 한 가지 가능한 방법

class A : 
    public std::enable_shared_from_this<A> { 
    public: 
     void setup_B (const B& my_B) { 
     my_B.set_A (shared_ptr_from_this()) ; 
} 
class B { 
    private: 
    const shared_ptr<A> private_A_ptr; 
    public: 
    void set_A (const shared_ptr<A> my_A): 
     private_A_ptr (my_A) { } 
} 
다음 INT의 main() { static_A 의해 구현 될 수

; B static_B; A.setup_B (static_B); }

이 마지막 구성의 shared_ptrAB보다 먼저 삭제되는 문제를 방지합니까?

+0

왜 콘솔 출력을 시도해보십시오. 하지만 아무도 A를 더 이상 가리 키지 않으면 A가 삭제됩니다. – Hayt

+1

"이 마지막 구성의 shared_ptr은 B가 삭제되기 전에 A가 삭제되는 문제를 방지합니까? 네, 그렇습니다. 유일한주의 사항은 A 자체가 shared_ptr에 의해 소유되어야한다는 것입니다. 그렇지 않으면 shared_from_this()가 UB가됩니다. –

답변

2

shared_ptr입니다. 다음과 같이 입력하십시오 :

관련 문제