指向成员函数的函数指针
Function pointer pointing to member function
我在创建一个普通的旧函数指针并将其分配给来自 myclass object obj[=24 的成员函数时遇到问题=].我在下面复制了一个示例,
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
我需要使用普通的旧函数指针而不是指向 class 成员函数的指针来获取 func 中的第三个 。需要一些帮助。我在这里缺少语法吗?!
func
是一个非静态成员函数。它需要一个 myclass
对象来操作(函数内部 this
将指向的对象)。这就好像函数有一个不可见的 myclass
参数。
fptr2
是一个没有任何参数的函数的函数指针,因此赋值被拒绝。以下是一些替代解决方案:
- 使
func
静态。
- 将
fptr2
的类型更改为指向成员的指针。
- 不要使用原始函数指针;切换到 C++11 lambdas and/or
std::function
.
这是后者的一个例子:
std::function<void()> f2;
f2 = [&]{ obj.func(); };
f2();
我在创建一个普通的旧函数指针并将其分配给来自 myclass object obj[=24 的成员函数时遇到问题=].我在下面复制了一个示例,
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
我需要使用普通的旧函数指针而不是指向 class 成员函数的指针来获取 func 中的第三个 。需要一些帮助。我在这里缺少语法吗?!
func
是一个非静态成员函数。它需要一个 myclass
对象来操作(函数内部 this
将指向的对象)。这就好像函数有一个不可见的 myclass
参数。
fptr2
是一个没有任何参数的函数的函数指针,因此赋值被拒绝。以下是一些替代解决方案:
- 使
func
静态。 - 将
fptr2
的类型更改为指向成员的指针。 - 不要使用原始函数指针;切换到 C++11 lambdas and/or
std::function
.
这是后者的一个例子:
std::function<void()> f2;
f2 = [&]{ obj.func(); };
f2();