2016-11-14 6 views
0

Ich programmiere gegen eine externe Bibliothek, die eine statische Callback-Funktion erfordert. Ich habe meinen Callback als statisch deklariert, aber dann verliere ich den Zugriff auf die Objekteigenschaften, die ich mit diesem Callback ändern möchte.Zugriff auf Eigenschaften des Objekts von der statischen Methode

Gibt es eine Möglichkeit, wie kann ich einen statischen Rückruf erstellen, während ich auf meine aktuellen Objekteigenschaften zugreifen kann? Die Bibliothek, die ich verwende, ist die openInventor-Bibliothek. Die Callback-Verkabelung bis wird mit dem folgenden Code getan:

SoSelection *selNode = new SoSelection; 
selNode->addSelectionCallback(MyClass::selCallback); 
+0

'userData' kann für diesen Zweck reserviert werden. Zu überprüfen, aber 'MyClass * obj = static_cast (userData)' kann Ihnen einen Zugriff auf 'obj-> classProperty' geben. Sie sollten die Aufrufe Ihrer Callback-Funktion überprüfen, um zu wissen, ob und wie das Objekt übergeben wird. – Franck

+1

_Wie kann ich einen statischen Callback erstellen, während ich auf meine aktuellen Objekteigenschaften zugreifen kann? Nun, das ist der Grund, warum Sie nicht aus einem statischen Kontext auf nicht statische Eigenschaften/Methoden zugreifen können. Statische Methoden/Eigenschaften sind für alle Instanzen einer Klasse üblich, und Sie haben möglicherweise Hunderte von Instanzen erstellt. Also, wie entscheidest du, was ist _current object_ aus einem statischen Kontext? In der Regel wird ein Zeiger auf das Objekt an die statische Methode übergeben. Dann können Sie auf die Eigenschaften des Objekts zugreifen, an dem Sie interessiert sind. –

Antwort

1

Die Methode addSelectionCallback verfügt über einen optionalen Parameter für den Zeiger userData. Dort sollten Sie die Objektinstanz senden, die Sie dann in Ihrem Callback erhalten.

Innerhalb der Methode können Sie auf den korrekten Objekttyp tippen und die eigentliche Arbeit mit der Objektinstanz ausführen.

Zum Beispiel:

void MyClass::selCallback(void* userData, SoPath* selPath) { 
    static_cast<MyClass *>(userData)->classProperty = 3; 
} 

MyClass myInstance; 
selNode->addSelectionCallback(MyClass::selCallback, &myInstance); 
1

Normalerweise gibt es einen Ort, wo die void* userData angegeben werden kann, entweder wenn das Bibliotheksobjekt erstellt wird oder wenn die Callback-Registrierung. Sie können dies auf einen Zeiger auf das Objekt setzen, auf das Sie vom Rückruf aus zugreifen möchten. Dann werfen Sie innerhalb des Callbacks den Zeiger void* zurück auf einen Zeiger auf Ihre Klasse und manipulieren ihn dadurch.

Auf diese Weise können Sie keine C++ - Smartpointer verwenden, Sie müssen sich also selbst um die Lebensdauer der Objekte kümmern.

Verwandte Themen