1

cocos2d-x ソース コードには、以下に示すメンバー関数ポインターを処理するコードがいくつかあります。

...
#define     menu_selector(_SELECTOR)   (SEL_MenuHandler)(&_SELECTOR)
...
typedef void(CCObject::*    SEL_MenuHandler )(CCObject *)
...

私が集めたアイデアはmenu_selector(<MyClass>::<MyFunction>)、互換性のある関数ポインターを取得するために使用することです。しかし、C スタイルのキャストを使用すると、安全でないキャストを実行でき、未定義の動作が発生する可能性があると思います。私はここで間違っていますか?

ちょうど今、私の同僚が以下のコードに問題を抱えていました

class HelloWorld:public CCObject{

    void function();

}

....., menu_selector(HelloWorld::function)); //last arg to another function call

このコードは、VS2010 で不正な変換エラーを発生させました。これは、CCObject *パラメータが必要であるためですが、IOS または Android コンパイラでは発生しません (モバイル コンパイラの古さは不明です)。私自身、同様のコードでこれをテストし、実際にVS2010でコンパイルすることができました..

私が求めているのは、の代わりにcocos2d-x使用する理由はありますか? そのような違法なキャストをすべてブロックしたでしょう。からへの変換をブロックするためですか?(TYPE)static_cast<TYPE>static_caststatic_cast(HelloWorld::*...)(CCObject::*...)

編集: による派生クラス関数ポインターの基本クラス関数ポインターへの変換はstatic_cast 合法であるように思われるため、なぜ選択するのかについてはわかりません(TYPE)

4

0 に答える 0