今天,我在看<<C++程序设计语言>>时,看到指向成员的指针时,看到这样一段话:
第一个map的第二个成员是类的实例的指针
第二个map的第二个成员是指向该类的成员函数的指针
由于这本书思维写的有些跳跃,我自己想了一会,然后,也请教了朋友,终于明白用处,果然很好用。
class sdf
{
public:
string add();
string sub();
string subA();
string subB();
private:
int a,b;
};
string sdf::sub()
{
cout << "sub 5" << endl;
return "5";
}
string sdf::add()
{
cout << "sub 6" << endl;
return "6";
}
string sdf::subA()
{
cout << "subA 7" << endl;
return "6";
}
string sdf::subB()
{
cout << "subB 8" << endl;
return "6";
}
typedef string (sdf::*cc)();
map<string,sdf*> varib;
map<string,cc> operation;//operation的second是成员函数指针
void call_member(string var,string oper)
{
varib["a"]->sub();
(varib[var]->*operation[oper])();
}
int main()
{
sdf* obj = new sdf();
cc vc = &sdf::add;
(obj->*vc)();//通过指向成员的指针调用
varib["a"] = obj;
operation["add"] = vc;
call_member("a","add");
varib["b"] = new sdf;
operation["c"] = &sdf::add;
operation["d"] = &sdf::sub;
call_member("b","c");
system("pause");
return 0;
}
把对象与函数地址存在map中, 用一个字符串做为key,这样,可以以不同的名字来调用到成员函数,指针本质上就是内存地址。对于变量,变量当然有存放地址;对于函数,函数代码也是存在内存中的,因此也有地址。这样看,上面所说的一切又都是合情合理的。
我们再看一个例子,”int ccc::*bb = &ccc::aa“里 bb 到底指向了什么。指针一般与内存地址相对应的,那么这个bb指向什么内存地址了?但是却可以发现,其实bb没有指向什么内存地址,它只是指向了class ccc 里的偏移而已。那么从这个角度来说,它至少是非典型的指针。