之前在设计指令类的时候,需要对传入的指令和参数进行解析和执行。
有点类似于int main(int argc, char** argv)
。
这种类的成员函数有一个特点:数量多,返回值和参数列表大多相同。而且他们的函数名一一对应指令集(一个由指令字符串构建的数组)。
之前一直是用switch
语句来判断具体执行那一个成员函数。这种方法写起来的代码非常长,也很容易漏掉break
。
后来就想到用函数指针来解决这个问题。可以直接创建一个关于类的成员函数指针数组,通过下标的方式来确定具体执行的是哪一个成员函数。
首先创建一个中介函数,让中介函数判断应该调用哪个功能函数。
成员函数指针和普通函数指针有所不同。
具体实现如下
#include <iostream>
#include <vector>
class test
{
public:
test(int a)
{
this->data = a;
// 中介函数
this->pShow(this);
}
// 中介函数必须为静态static
static void pShow(test *t)
{
// 创建指向函数show的指针
// 注意:此指针可以对不同的对象进行操作,调用的成员函数属于传入的类指针指向的对象的成员函数
void (test::*p)(void) = &test::show;
// 调用t指向对象的show
(t->*p)();
// 成员函数指针数组,注意vector的模板类型
// 数组中的函数,返回值和参数列表必须相同
const std::vector<void (test::*)(void)> funcs =
{
&test::show,
&test::delete_data
};
// 调用t对象的delete_data
(t->*funcs[1])();
// 调用t对象的show
(t->*funcs[0])();
}
private:
void show()
{
printf("%d", this->data);
}
void delete_data()
{
data = 0;
}
private:
int data;
};
int main(void)
{
test t(314159), t2(123456);
return 0;
}