我在创建普通旧函数指针并将其从 myclass 对象 obj 分配给成员函数时遇到了问题。我已经复制了下面的示例,
class myclass
{
public:
myclass() { i = 38; }
int i;
void func() { cout << "inside func" << endl; }
};
int main()
{
myclass obj;
myclass *objptr = &obj;
int myclass::*iptr1; //decl pointer to member
iptr1 = &myclass::i; //obtain offset
cout << obj.*iptr1 << endl; //dereference using object; use .*
cout << objptr->*iptr1 << endl; //dereference using pointer to object; use ->*
int *iptr2; //decl plain old integer pointer
iptr2 = &obj.i; //obtain address of member
cout << *iptr2 << endl; //dereference
void(myclass::*fptr1)(); //decl pointer to member
fptr1 = &myclass::func; //obatain offset
(obj.*fptr1)(); //dereference using object; use .*
(objptr->*fptr1)(); //dereference using pointer to object; use ->*
/*void(*fptr2) (); // decl plain old function pointer
fptr2 = obj.func; //this is the exact line that doesn't compile
(*fptr2) ();*/ //after having a pointer to the member function *func* I would like to call it like this, if possible, from this plain old pointer
getchar();
return 0;
}
如果三行未注释,我会收到以下错误
Error C3867 'myclass::func': non-standard syntax; use '&' to create a
pointer to member
Error C2440 '=': cannot convert from 'void (__thiscall myclass::* )
(void)' to 'void (__cdecl *)(void)'
如果不是三行,我得到预期的输出
38
38
38
inside func
inside func
我需要使用普通的旧函数指针而不是指向类成员函数的指针来获取func 中的第三个。需要一些帮助。我在这里缺少语法吗?!
答案 0 :(得分:0)
func
是一个非静态成员函数。它需要一个myclass
对象来操作(函数内部this
将指向的对象)。就好像该函数有一个不可见的myclass
参数。
fptr2
是没有任何参数的函数的函数指针,因此拒绝赋值。以下是一些替代解决方案:
func
静态。fptr2
的类型更改为指向成员的指针。std::function
。以下是后者的一个例子:
std::function<void()> f2;
f2 = [&]{ obj.func(); };
f2();