指向成员函数的函数指针

时间:2017-04-29 12:56:11

标签: c++ pointers function-pointers member-function-pointers

我在创建普通旧函数指针并将其从 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 中的第三个。需要一些帮助。我在这里缺少语法吗?!

1 个答案:

答案 0 :(得分:0)

func是一个非静态成员函数。它需要一个myclass对象来操作(函数内部this将指向的对象)。就好像该函数有一个不可见的myclass参数。

fptr2是没有任何参数的函数的函数指针,因此拒绝赋值。以下是一些替代解决方案:

  • func静态。
  • fptr2的类型更改为指向成员的指针。
  • 不要使用原始函数指针;切换到C ++ 11 lambdas和/或std::function

以下是后者的一个例子:

std::function<void()> f2;
f2 = [&]{ obj.func(); };
f2();