如何将 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 宏
我目前正在 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 宏