2017-12-10 3 views
0

Ich habe eine class MyClass, die in QSharedPointer<MyClass> verpackt zurückgeben kann.QEnableSharedFromThis :: sharedFromThis() liefert nullptr

Es ist mein Verständnis (und Erfahrung), dass einfach neue Instanzen von QSharedPointer<MyClass>(this) ist nicht der Weg zu gehen. Stattdessen ist der korrekte Weg, um zu erreichen, was ich will, MyClass erben von QEnableSharedFromThis<MyClass>, um die Mitgliedsfunktion sharedFromThis() zur Verfügung zu stellen.

Diese Elementfunktion sollte dieses in QSharedPointer<MyClass> ohne alle die negativen Nebenwirkungen zurückgegeben werden, die andernfalls auftreten würden.

class MyClass : public QEnableSharedFromThis<MyClass> 
{ 
    /* ... */ 
    public: 
     void testSharedThis() 
     { 
     auto sp=QEnableSharedFromThis<MyClass>::sharedFromThis(); 
     if(sp.isNull()){ 
      qWarning()<<"SHARED POINTER TO *this* WAS NULL!"; 
     } 
     } 
}; 

void main(){ 
    MyClass *mc=new MyClass; 
    mc->testSharedThis(); 
} 

Jedoch, wenn ich testSharedThis() im Beispiel oben ausgeführt, gibt sharedFromThis() immer nullptr statt dies in QSharedPointer<MyClass> gewickelten.

Ich bin neu zu QEnableSharedFromThis und ich frage mich, ob es etwas gibt, das ich vermisse, oder was könnte die Ursache dafür sein?

Antwort

2

Nach der offiziellen Dokumentation:

Eine Basisklasse, die eine QSharedPointer für ein Objekt von einem gemeinsamen Zeiger bereits gelungen, erlaubt zu erhalten. Sie können diese Klasse erben, wenn Sie einen QSharedPointer von einer beliebigen Instanz einer Klasse erstellen müssen. zum Beispiel von innerhalb des Objekts selbst.

So müssen Sie Ihren Zeiger als Smart-Pointer-instanziiert:

QSharedPointer<MyClass> mc(new MyClass()); 
mc->testSharedThis(); 

Oder in Ihrem Fall das Äquivalent verwenden, um std :: make_shared für Qt Smart-Pointers:

QSharedPointer<MyClass> mc = QSharedPointer<MyClass>::create(); 
mc->testSharedThis();