2017-09-14 1 views
2

현재 Unreal 엔진의 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가 콜백으로 다시 전달되는 "클로저"값을 제공하면 (예 : C API의 경우 'void * data'와 같은 것입니다),'B * '및 a를 포함하는 작은 구조체에 포인터를 전달할 수 있습니다 '(B :: *)()'를 호출 한 다음, 콜백 함수를 'void * data' 클로저 포인터를 구조체에 캐스트 한 후 적절한 함수를 호출하는 래퍼 함수로 만듭니다. (간단히 말하면, 그것들을 람다 객체에 묶고,'std :: function' 객체에 집어 넣은 다음 콜백에'void * data'를'std :: function' 유형으로 캐스팅하고 호출하십시오.) –

답변

4

void (B::*)()은 비 정적 멤버 함수에 대한 포인터이고 void (*)()은 비 멤버 함수에 대한 포인터입니다. 이 둘 사이에는 변환이 없습니다.

B::Foo을 static으로 설정하면이 문제가 해결됩니다. 그러나 인스턴스 멤버 인 B에 액세스 할 수 없습니다.

함수 포인터, 멤버 또는 비 멤버를 사용하는 것은 함수 개체를 전달하는 이전 스타일입니다. 보다 현대적인 방법은 객체와 그 구성원 함수 중 하나의 조합으로 구성 할 수있는 객체를 사용하는 것입니다.

0

는 클래스 A는 당신이 시도 할 수있는 임의의 클래스 X에서하는 방법을 실행하도록 찾는 경우 :이 경우

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

우리가 인수로 단일의 int로 함수를 호출하고 있습니다. 클래스 B는이 작업을 수행 할 수 있습니다 :

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

희망

void B::MyMethod(int) {} 

과이 당신 도움이! 더 많은 정보를 원한다면, 언리얼 엔진에서 Delegate.h의 AddDynamic 매크로를 볼 수 있습니다.

관련 문제