2010-07-12 3 views
5

내가 부모 - 자식 관계를 가진 두 개의 클래스를 (등 고객 & 위해 디렉토리 & 파일)부스트 shared_ptr의와 '이'

나는

typedef boost::shared_ptr<Parent> ParentPtr 

및 부모 클래스의를 만들 수있는 방법이 자식

부모 인스턴스에 대한 포인터를 가질 자식 인스턴스가 필요합니다.

class Child 
{ 
.... 
    ParentPtr m_parent; 
.... 
} 

나는 기존의 어린이가있는 동안 부모가 사라지지 않도록 그것이 shared_ptr을 원한다. 또한 부모 (부모의 공장 출하 방법은 ParentPtr을 반환)에 ParentPtrs을 잡고 다른 사람이

질문 : 아이에게 ParentPtr

시도를 줄 수있는 방법 (1). 부모 :: ChildFactory에서

child->m_parent.reset(this); 

이것은 매우 나쁜 결과를 초래합니다. 이제 부모를 가리키는 2 개의 ParentPtr '체인'이 있습니다. 결과는 부모의 조기 사망이다.

시도 (2). 부모가

ParentPtr m_me; 

이며 부모 팩토리의 반환 값에서 복사됩니다. 그것이 내가 enable_shared_from_this이 문제를 해결하는 것이 매우 확신 자체

답변

8

에 대한 참조를 보유하고 있기 때문에 그래서

child->m_parent = m_me; 

을 수행 할 수 있습니다하지만 지금 부모는 결코 죽지 : 당신이에서 클래스를 파생하는 경우 http://live.boost.org/doc/libs/1_43_0/libs/smart_ptr/enable_shared_from_this.html

전문화 된 boost::enable_shared_from_this이면 shared_from_this()을 구성원 함수에 사용하여 this을 소유하는 공유 포인터를 얻을 수 있습니다 (하나 있다고 가정).

예. 다른 응답이 밖으로 포인터를 가지고 있기

class Parent : public boost::enable_shared_from_this<Parent> 
{ 
    void MakeParentOf(Child& c) 
    { 
     c.m_parent = shared_from_this(); 
    } 
}; 
+0

감사합니다. 감사합니다. – pm100

+0

@ pm100 : 왜 'weak_ptr'을 사용해야합니까? 자녀가 부모를 소유하고 있다면 (그들과 공유), 당신은'shared_ptr'을 사용할 필요가 있습니다. 'weak_ptr '은 소유권을 의미하지 않습니다. –

+0

아, 네가 맞아 - 내가 다른 해결책을 생각하고있어 - 편집을 취소했다 – pm100

0

먼저 당신은 shared_ptr를 얻기 위해 enable_shared_from_this을 사용해야합니다,하지만 그 심판을 수 없습니다 아이, 그것은 weak_ptr를 사용해야합니다. weak_ptrshared_ptr과 같지만 get() 메서드를 호출 할 때까지는 참조를 보유하지 않습니다. 그러면 shared_ptr이 반환되며 이는 자식 내부에서 가능한 한 빨리 제거해야합니다.

+0

왜 이것을 생각하니?이 모델은 아이들 (다른 사람들과 함께)이 부모를 소유한다는 것입니다. 부모는 자녀를 소유하지 않습니다. 아이들이 약한 포인터를 사용하면 여전히 아이들이있는 동안 부모가 "사라지는"것을 막지 못합니다. –

+0

@Charles 죄송합니다, 형편 없음. 명시 적으로 언급되지 않은 것들을 가정하고 있습니다 :'shared_ptr'과'weak_ptr'을 사용하면 부모는 자녀들에게 심판을 갖게 될 것이라고 생각했습니다. 나는 기본적으로 18 세가되어 집을 떠나기 전까지는 부모가 자녀를 통제하기 때문이라고 가정했습니다. 다른 방법이라면 내가 말한 모든 것을 무시하십시오. – Gianni

+0

음, pm100 코드의 구조가 정확히 무엇인지는 모르겠지만 부모님이 자식을 가지고있는 동안 부모가 파괴되는 것에 대해 걱정한다면 부모 클래스가 소유 할 수 없습니다 (직접 값을 사용하거나 'shared_ptr') 자식 클래스를 사용하지 않으면 고려 대상이되지 않습니다. 소유 관계는 아이가 마지막 부모보다 오래 살 수 없음을 보장합니다. 그대로, 필요한 소유권은 다른 방향입니다. "기존 자녀가있는 동안 부모가 사라지지 않도록 shared_ptr이되기를 바랍니다." –