2012-03-23 4 views
4

며칠 동안 공유 포인터를 이해하려고 시도하고 있었고 그것을 얻을 수없는 것처럼 느껴졌습니다. 그것이 명백한 것인지 또는 너무 복잡 한 것인지 확실하지 않습니다. 우선, 누군가 공유 포인터를 사용하는 예를 들어주십시오. Wikipedia의 예제는 나에게 의미가 없습니다. 그리고 공유 포인터를 다른 함수에 전달하거나 공유 포인터가있는 객체를 만드는 방법은 무엇입니까? 그래서, 어떻게 전달하고 어디에서 사용할 것입니까? 어떤 정보 나 예도 좋을 것입니다.QSharedPointer, 전달 방법 및 필요합니까?

또한 무엇을 사용해야할지 모르겠다. 이 함수는 QFile을 할당하고 다른 클래스의 함수에 전달합니다. 이 함수는 파일을 QIODevice*으로 가져온 다음 파일을 포함하는 개체를 만듭니다. 여기에 가장 좋은 해결책이 무엇인지 그리고 공유 포인터를 어떻게 사용해야하는지 궁금합니다. <QFile>과 공유 포인터를 만들고 함수가 <QIODevice> 인 곳으로 전달하는 방법은 무엇입니까? 필자는 전혀 공유 포인터를 얻지 못한다고 느낀다.

다른 접근법은 의 할당을 QScopedPointer에 넣는 것이다. 그런 다음 클래스에 전달하고 파일을 저장할 객체를 만들 때 QPointer 또는 QScopedPointer을 사용합니다. 첫 번째 호출 함수의 끝에서 take()를 호출해야합니까?

function() { 
    QScopedPointer<QFile> item(new QFile("filename")); 
    SomeClassObject->doStuff(item.data()); 
    item.take(); 
} 
--------------------------------- 
SomeClass::doStuff(QIODevice *item) { 
    _currentObject = new MyObject(item); // should _currentObject be a smartpointer? 
    ... 
} 
--------------------------------- 
class MyObject { 
    QPointer<QIODevice> _item; 

    ... 
    MyObject(QIODevice *item) { _item = item; } 
} 

그래서 "새로운"예외가 발생할 경우 포인터를 만들고이를 처리하는 방법을 저장하고 싶습니다.

답변

8

공유 포인터 (포인터와 다른 유사한 래퍼)의 포인트는 포인터에서 개체로의 파괴를 적절하게 처리하는 것입니다. 이는 수동으로 마지막 복사본 (그리고 마지막 복사본 만)을 수동으로 삭제해야하는 대신 공유 포인터가 범위를 벗어날 때이를 대신 처리합니다. 공유 부분은이 래퍼 객체 (공유 포인터 객체)의 사본을 만들 수 있고 추가 된 이점을 사용하여 사본 사이에 (보통 포인터의 복사본을 만든 것처럼) 객체에 대한 포인터를 "공유"한다는 것을 의미합니다 전술 한 바와. 당신이 그 유형이있는, 그것을 item를 통과하는대로

는 코드에 관해서는, SomeClass::doStuff()은 (대신 QIODevice* 하나의)는 QScopedPointer<QFile> 매개 변수를 가져야한다.

MyObject의 생성자와 동일 : QPointer<QIODevice> 또는 QSharedPointer<QIODevice> 유형의 매개 변수를 사용합니다. 일반적으로 포인터를 사용하는 모든 곳에서는 대신 적절한 템플릿 유형을 사용하여 QSharedPointer을 사용하십시오. 이렇게하면 나중에 삭제 된 개체에 액세스하는 것과 관련된 두통에서 벗어날 수 있습니다.

물론 때로는 실제 QIODevice 포인터 (예 : 타사 라이브러리 호출 용)가 필요하면 공유 포인터 객체의 data() 멤버 함수를 사용합니다. 리턴 된 미가공 포인터는 공유 포인터의 목적을 저해 할 것이기 때문에 (즉, 스토어 또는 필요한 것 이상으로 복사하는) 지속되지 않도록하십시오. 공유 포인터는 미처리 된 추가 원시 포인터를 알 수 없습니다 공유 포인터 객체의 관리.

EDIT : take()은 범위가 지정된 포인터에서 지정 대상 개체의 소유권을 해제하므로 범위가 지정된 포인터가 소멸되면 개체를 삭제하지 않습니다. 당신은 소유권을 다른 것으로 옮겼을 때 - 예를 들어 MyObject과 같은 상황에서 그것을 사용하지 않을 것입니다.

+1

함수의 인수를 QScopedPointer로 만드는 좋은 이유는 없습니다.포인터를 사용하지 않고 원시 포인터 (모든 * 관리 된 포인터 타입을 허용)로 만들거나 공유 포인터로 만듭니다. (복사를 피하고 객체를 공유하는'_currentObject'를 만듭니다. 가능성). 범위가 지정된 포인터를 전달하는 것은 참조해야하고 사용자에게 스마트 포인터를 선택하도록 강요합니다. 다른 유형의 스마트 포인터를 사용하는 경우에는 좋지 않습니다. –

+1

보이지 않습니다. 왜 원시 포인터 대신에 공유 포인터를 전달하는 것이 문제가되는지 (특정 유형의 강제력 외에도). 원시 포인터를 전달하는 것보다 안전하다고 생각합니다 (예 : 호출자가 내 컨테이너에서 삭제하는 것을 두려워하지 않고 전역 컨테이너에 매개 변수를 저장할 수 있음). 공유 포인터는 확실히 참조 할 필요는 없지만 복사 생성자 논리는 복사본이 적절하게 동작하는지 확인합니다. 확실히 참조를 통해 기본 객체를 전달할 수 있지만 포인터를 사용하는 이유는 무엇입니까? – Attila

+0

QFile과 함께 사용할 것이므로 QIODevice를 사용해야합니다. 코드에서 함수가 기본 유형을 취해야하는 다른 상황이 있습니다. – chikuba