0%

C++中类的成员函数的函数指针

获取指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A
{
public:
static void staticmember() { cout << "static" << endl; } //static member
void nonstatic() { cout << "nonstatic" << endl; } //nonstatic member
virtual void virtualmember() { cout << "virtual" << endl; }; //virtual member
};
int main()
{
A a;
//static成员函数,取得的是该函数在内存中的实际地址,而且因为static成员是全局的,所以不能用A::限定符
void (*ptrstatic)() = &A::staticmember;
//nonstatic成员函数 取得的是该函数在内存中的实际地址
void (A::*ptrnonstatic)() = &A::nonstatic;
//虚函数取得的是虚函数表中的偏移值,这样可以保证能过指针调用时同样的多态效果
void (A::*ptrvirtual)() = &A::virtualmember;
//函数指针的使用方式
ptrstatic();
(a.*ptrnonstatic)();
(a.*ptrvirtual)();
}

在map中使用指针

直接使用对应类型也是可以的,比如:

1
map<string, void (A::*)()> zeroParmsFuns;

不过为了方便起见,还是自定义类型吧

1
2
typedef void (A::*func)();
map<string, func> zeroParmsFuns;

使用迭代器来遍历map,funcName是函数名,对应map的key

1
2
3
4
5
map<string, func>::iterator iter = zeroParmsFuns.find(funcName);
if (iter != zeroParmsFuns.end())
{
(this->*(iter->second))();
}

参考

C++中怎么获取类的成员函数的函数指针?
C++ 类内函数指针的使用的使用