2016-11-14 6 views
0

静的コールバック関数を必要とする外部ライブラリに対してプログラミングしています。コールバックを静的なものとして宣言しましたが、このコールバックで変更したいオブジェクトプロパティへのアクセスが緩くなりました。静的メソッドからのオブジェクトのアクセスプロパティ

.h 
static void selCallback(void* userData, SoPath* selPath); 

.cpp 
void MyClass::selCallback(void* userData, SoPath* selPath) { 
    classProperty = 3; 
} 

現在のオブジェクトのプロパティにアクセスできるうちに静的コールバックを作成する方法はありますか?私が使用するライブラリはopenInventorライブラリです。通常、ライブラリオブジェクトを作成するとき、またはコールバックを登録するときvoid* userDataはどちらか、指定することができますいくつかの場所がある

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

は 'userData'は、この目的のために予約されてもよいです。チェックするには 'MyClass * obj = static_cast (userData)'を実行すると、 'obj- classProperty'へのアクセス権が与えられます。コールバック関数の呼び出しを調べて、オブジェクトが渡されたかどうか、どのように渡されるかを知る必要があります。 – Franck

+1

_私は現在のオブジェクトのプロパティにアクセスできるように静的なコールバックを作成する方法はありますか?_まあ..静的なコンテキストから非静的なプロパティ/メソッドにアクセスすることができない理由です。静的メソッド/プロパティはクラスのすべてのインスタンスに共通であり、何百ものインスタンスが作成されることがあります。だから、どのようにして決定するのですか、現在のオブジェクト_は静的コンテキストから何ですか?これは通常、オブジェクトへのポインタを静的メソッドに渡すことです。次に、関心のあるオブジェクトのプロパティにアクセスできます。 –

答えて

1

addSelectionCallbackメソッドには、userDataポインタのオプションパラメータがあります。ここでオブジェクトインスタンスを送信する必要があります。オブジェクトインスタンスは、コールバックで受信します。

このメソッドの内部では、正しいオブジェクト型に型キャストし、オブジェクトインスタンスで実際の作業を実行できます。例えば

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

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

:コールバック配線アップは、次のコードで行われます。これは、コールバックからアクセスしたいオブジェクトへのポインタに設定できます。コールバックの中でvoid*ポインタをクラスへのポインタにキャストし、それを操作します。

このようにしてC++スマートポインタを使用することはできません。したがって、オブジェクトのライフタイムを自分で処理する必要があります。

関連する問題