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

How to convert void (myClass::*)() to void (*)()

我目前正在 Unreal Engine 上开发一个 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 (*)()

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

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

B::Foo设为静态可以解决这个问题。但是,您将无权访问 B.

的实例成员

请注意,使用函数指针,无论是成员还是非成员,都是传递函数对象的旧方式。一种更现代的方法是使用 std::function 对象,它可以由对象及其成员函数之一的组合构造。

如果您希望 class A 从任意 class X 执行一个方法,您可以试试这个:

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

在这种情况下,我们将调用一个函数,将单个 int 作为参数。 A class B 可以这样做:

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

void B::MyMethod(int) {}

希望对您有所帮助!如果您想了解更多信息,在 unreal engine 中,您可以查看 Delegate.h

中的 AddDynamic 宏