我想要一个可以在另一个类内部调用的函数,该类具有类型void函数指针的单个输入参数。在函数内部,函数指针应该执行它所指向的函数。
// inside TestClass.h
class TestClass
{
public:
template<class UserClass>
static void TestingFctPtrStatic(void (UserClass::* TestFunction)(void), UserClass* Object);
};
template<class UserClass>
inline void TestClass::TestingFctPtrStatic(void (UserClass::* TestFunction)(void), UserClass* Object)
{
Object->TestFunction();
}
在TestClass的构造函数中像这样调用函数会产生以下编译错误:// inside TestClass.cpp
TestClass::TestClass()
{
TestClass::TestingFctPtrStatic<TestClass>(&TestClass::PrintStuff, this);
}
与PrintStuff ():
void TestClass::PrintStuff()
{
std::cout << "Printing stuff!" << std::endl;
}
错误C2039: 'TestFunction':不是'TestClass'的成员消息:参见声明'TestClass'参见函数模板实例化的参考'void TestClass::TestingFctPtrStatic(void (__cdecl TestClass::*)(void),UserClass *)'正在编译与[UserClass = TestClass)
编辑:
我通过在实现中使用更多的括号来修复它:
template<class UserClass>
inline void TestClass::TestingFctPtrStatic(void (UserClass::* TestFunction)(void), UserClass* Object)
{
(Object->*TestFunction)();
}
void(UserClass::* TestFunction)(void)
这不是指向函数的指针。它是指向类方法的指针。
TestFunction();
你不能凭空调用一个类方法。你需要一个对象,一个类的实例,它的方法被调用。如果p
是指向UserClass
的指针,也就是说:
UserClass *p=(points to somewhere);
则使用以下语法调用它的方法:
(p->*TestFunction)();
从问题的描述中不清楚调用其方法的对象来自何处,因此您需要根据问题中未包含的所有其他信息自己弄清楚。以某种形式或方式,你需要找到一个UserClass
对象,在某个地方——要么作为一个额外的参数传递进来,要么它躺在周围,在某个地方,在一般附近——然后你可以使用TestFunction
指针来调用这个对象的方法。
这是c++的基础,前提是这是一个类方法。如果这个PrintStuff
是一个static
类方法,那么这确实是一个普通的旧函数指针:
void (*TestFunction)();
它将通过指针被调用,这与其他函数没有什么不同。