2017-09-14 5 views
2

現在、Unreal EngineのC++プロジェクトで作業しています。void(myClass :: *)()をvoid(*)()に変換する方法

class A 
{ 
public: 
    void (* array[10])(); 

    //Add Function to an array 
    void AddFunctionToArray(void(*function)()); 
}; 

class B 
{ 
public: 

    A a; 

    //Sending a B function to A 
    void SendMyFunction(); 
    void Foo(); 
}; 

void B::SendMyFunction() 
{ 
    a.AddFunctionToArray(&B::Foo); 
} 

私はエラーを取得する:can't convert void (B::*)() to void (*)()

どのように私は別の私のクラスのいずれかから関数ポインタを送ることができますか?

+0

おそらくCスタイルの配列の代わりに 'std :: vector'を使いたいでしょう。 – tadman

+0

'B :: Foo'は' B'を実行する必要があります。 Unreal Engineには 'B'がありませんので、呼び出すことはできません。 'B :: Foo'を' static'にするか、 'B'の外側で自由な関数にして、' B'を必要としないようにしてください。 – nwp

+0

Unreal APIがコールバックに返される "closure"値を提供する場合(例えばC APIの場合は 'void * data'のようなものです)、' B * 'とaを含む小さな構造体へのポインタを渡すことができます'(B :: *)()'を呼び出すと、コールバックをラッパー関数にして 'void * data'クロージャーポインタを構造体にキャストしてから適切な関数を呼び出します。 (あるいは単純にラムダオブジェクトにバインドし、それを 'std :: function'オブジェクトに貼り付け、コールバックで' void * data'を 'std :: function'型にキャストして呼び出します)。 –

答えて

4

void (B::*)()は非静的メンバー関数へのポインタであり、void (*)()は非メンバー関数へのポインタです。 2つの間に変換はありません。

B::Fooを静的にするとこの問題が解決されます。ただし、Bのインスタンスメンバーにはアクセスできません。

関数ポインタ、メンバーまたは非メンバーを使用することは、関数オブジェクトを渡す古いスタイルであることに注意してください。より現代的な方法は、オブジェクトとそのメンバ関数の1つの組み合わせから構築することができるstd::functionオブジェクトを使用することです。

0

あなたはクラスAはこれを試すことができ、任意のクラスXからメソッドを実行させる探しているなら:この場合

template <typename UserClass> 
void A::FireMethod(UserClass* InUserObject, typename TMemFunPtrType<false, UserClass, void(int)>::Type InFunc) 
{ 
    (InUserObject->*InFunc)(15); 
} 

我々は、引数として単一のint型で関数を呼び出しています。クラスBはこれを行うことができます:

void B::MyMethod(int) {} 

A* a = myAObject; 
a->FireMethod(this, &B::MyMethod); 

をこれはあなたのお役に立てば幸い!より多くの情報が必要な場合は、UnrealエンジンでDelegate.hのAddDynamicマクロを見ることができます

関連する問題