如何将void(myClass :: *)()转换为void(*)()

时间:2017-09-14 21:41:39

标签: c++ function pointers unreal-engine4

我目前正在使用虚幻引擎上的C ++项目,但我无法解决这个问题。

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 (*)()

如何将一个函数指针从我的一个类发送到另一个类?

2 个答案:

答案 0 :(得分:4)

void (B::*)()是指向非静态成员函数的指针,而void (*)()是指向非成员函数的指针。两者之间没有转换。

使B::Foo静态可以解决这个问题。但是,您无法访问B的实例成员。

请注意,使用函数指针(成员或非成员)是传递函数对象的旧样式。更现代的方法是使用std::function个对象,这些对象可以通过对象和其中一个成员函数的组合来构造。

答案 1 :(得分: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宏