2014-01-10 4 views
2

현재 QMainWindow에서 파생 된`foo '라는 Qt 양식 클래스가 있습니다.유효한 Qt 형식인지 알아보기

지금 다른 클래스에서 나는이

class someclass 
{ 
    private: 
     foo* form; 
    ...... 
    public: 
     someclass() 
     { 
      form = NULL; 
     }  
}; 

같은 지금 유효한 foo는 양식에 를 가리키는 경우 foo는 *가 유효한지 알 필요가 someclass의 방법이 있습니다. 나는 이것을 달성하는 가장 좋은 방법이 무엇인지 알고 싶었습니다. 내가

if(form!=NULL) {...} 

문제로 이동해야하는 것은 위의 방법이 신뢰할 수있는 유효한 양식을하는 것은 보증하지 않습니다. 어떤 제안?

+0

@Charles : 주제와 밀접하게 관련된 태그를 제거하지 마십시오. 불필요하게 질문을 범할뿐만 아니라 관련 카테고리에서 Q/A도 제거합니다. – lpapp

+0

@Laszlo, 나는 태그가 답에만 적용되는 질문에 라이브러리 태그를 추가해서는 안된다는 것을 입증하는 수많은 메타 링크로 당신을 때려 눕히려고했지만 이전 커뮤니티의 공감대를 완전히 잊어 버렸습니다. 의로운 태그 번뇌로 인한 불편을 끼쳐 드려 죄송합니다. – Charles

+0

@Charles : 걱정할 필요가 없습니다. – lpapp

답변

1

스마트 포인터를 찾고 있다고 생각합니다. 일반적으로이 검사는 약한 포인터에 의해 수행됩니다. 이것은 객체에 대한 소유권을 보유하지 않지만 isNull() method으로 유효성을 검사 할 수 있습니다.

Qt는 QWeakPointer이라는 편리한 클래스가 있습니다. 대개 Qt 세계에서 QSharedPointer이 될 공유 포인터와 쌍으로 사용됩니다.

QWeakPointer 클래스 공유 포인터 약한 참조를 보유

QWeakPointer는 C++에서 포인터에 자동 약한 참조한다. 포인터를 직접 참조 해제하는 데는 사용할 수 없지만 다른 컨텍스트에서 포인터가 삭제되었는지 여부를 확인하는 데 사용할 수 있습니다.

QWeakPointer 개체는 QSharedPointer에서 할당 한 경우에만 만들 수 있습니다.

개체를 소유 한 주 QSharedPointer에서 참조 된 포인터를 삭제했는지 확인하기 위해 실제로 사용할 수있는 방법이 나와 있습니다.

부울 QWeakPointer :: 대하여 isNull() const를

반환이 객체가 널 포인터에 대한 참조를 들고있는 경우는 true.

약한 참조의 특성으로 인해 QWeakPointer가 참조하는 포인터는 언제든지 null이 될 수 있으므로이 함수에서 반환 된 값은 한 호출에서 다음 호출로 false에서 true로 바뀔 수 있습니다.

이렇게하면 다른 클래스는 소유권이있는 포인터에 대한 참조를 얻을 필요가 없지만 정확한 사용 사례에 따라 어디서나 QSharedPointer를 사용할 수 있습니다.

+1

parentpt와 sharedptr 모두 소유권을 가지므로 sharedptr은 부모를 통과 할 때 QObject와 잘 작동하지 않습니다 (대화 상자에서 항상 창 스태킹을 중단하지 말아야 함). 부모 및 공유기가 소유권을 가져오고 sharedptr이 부모 먼저 삭제합니다. 따라서 Qt 컨텍스트에서 "모든 곳의 QSharedPointer를 사용할 수 있습니다."와 같은 문구에주의해야합니다. –

+0

@FrankOsterfeld : 음, "모든 곳"의 의도 된 의미가 그 문장에서 당신을 위해 나오지 않았던 것 같습니다. :) 그것은 모든 장소를 참조하려고 노력하고 있습니다 : 공유 포인터 멤버를 가진 클래스와 그것에 접근하는 아웃 타 코드. 이 단어는 "각 시나리오"를 언급하지 않습니다. Fwiw, 나는 심지어 각 시나리오가 아니라는 것을 의미하는 "당신의 유스 케이스에 의존한다"라고 썼다. 당신이 그것을 더 분명하게 할 수 있다고 생각한다면 제안 된 수정안을 제안 할 수는 있지만, 다른 문제가 없다면 그 의도는 여전히 정확하다고 생각합니다. – lpapp

+0

부모/자식 관계에 관해서는 포인터가 유효한지 확인하기를 원하는 경우 궁극적으로 그리고 항상 올바른 방법임을 확신하지 못합니다. 개인적으로 정보가 OP의 의도와 관련이 없다고 저는 개인적으로 믿습니다. 아마도 OP는 최대한 많은 정보를 제공하려고했지만, 부모가없는 메인 윈도우에서 궁극적 인 문제는 개인적으로 보지 못합니다. 그런 경우라면 API가이를 금지 할 것입니다. :) – lpapp

1

foo * 대신 foo 클래스의 범위에 따라 QScopedPointer 또는 QSharedPointer를 사용하십시오. 그렇게하면 포인터가 유효한지 안정적으로 검사 할 수 있으므로 null에 대한 포인터를 비교하면 삭제 된 포인터가 야생으로 향하는 것을 감지하는 데 도움이되지 않습니다.