2012-01-24 2 views
2

다음 예를 들어 보겠습니다. 자식 창을 가질 수있는 창 클래스가 있다고 가정 해보십시오. 각 자식 창은 부모 창에 약한 포인터를 보유하고 있으며, 각 창에는 자식에 대한 공유 ptrs 목록이 있습니다. 이제는 자식 창이 destructed 경우 부모 창이 닫혀 있기 때문에 destructed 경우 또는 자식 창 자체가 닫혀 있기 때문에 내가 알 수없는 상황이 있습니다. 이에C++ : 예외적 인 상황에서 예외를 사용하는 이유가 있습니까?

//we try to retain the parent window here 
try 
{ 
    //creates a shared pointer from the weak pointer, throws BadReferenceCounterException on fail 
    WindowPtr parent = m_parentWindow.retain(); 

    //check if there is a parent at all, otherwise 0 
    if(parent) 
    { 
     parent->removeChildWindow(this); 
    } 
    } 
    catch(const BadReferenceCounterException & _ec) 
    { 
    std::cout<<"Catched expected exception, if Parent was closed before me!"<<std::endl; 
    } 

: 그러므로 내가 생각 해낸 해결책은 시도 {} 캐치에서 자식 창 소멸자에서 부모 창 약한 포인터 역 참조 {} 부모 윈도우는 여전히 (의사) 존재하는지 차단했다 상황 소멸자가 호출 된 문맥을 알 수있는 방법이 없기 때문에이 문제를 해결하는 또 다른 방법을 생각할 수 없습니다. 일종의 예상 상황에서 예외를 사용하기 때문에 이렇게하는 것은 어리석은 짓입니까? 성능에 중요한 코드에서 수행하려는 작업이 아니라는 것을 알고 있습니다. 따라서이 질문의 핵심은 아닙니다.

감사합니다.

+3

사운드에 제시 한 코드 샘플을 체크 아웃 할 수 있습니다

typedef std::shared_ptr<Window> WindowPtr; typedef std::weak_ptr<Window> WeakWindowPtr; WeakWindowPtr m_parentWindow; //... WindowPtr parent = m_parentWindow.lock(); if (parent) { // here you know parent wasn't destroyed and you can access it via parent } 

: 표준 (모두 C++ 11에서 부스트에서) 공유/약한 포인터는 예외없이 할 수 있도록 거룩한 전쟁 영토처럼 나에게. 첫 발리슛을 드리겠습니다. 당신의 약한 포인터는 던지지 않고 유효성을 검사 할 수 있습니다. 'boost :: weak_ptr :: lock'은 그러한 접근에 대해 null boost :: shared_ptr를 반환합니다. – Managu

+0

@moka : "유효한"의미는 무엇입니까? –

+0

원하는대로 작동합니까? 충분히 잘 수행? 이해할 수 있니? 그런 다음 유효한 해결책 인 IMHO입니다. – Managu

답변

5

잘못된 공유/약한 포인터 쌍을 사용하고있는 것 같습니다. 당신은 또한 내가 this stackoverflow answer

+0

그리고 C++ 구문의 편리한 특징으로 인해 if (WindowPtr parent = m_parentWindow.lock()) {/ * parent * /} 사용}과'parent'가 올바른 범위를 가질 것이라고 말할 수 있습니다. – bames53

관련 문제