当前位置:C++技术网 > 资讯 > C++指向成员的指针,灵活性更好

C++指向成员的指针,灵活性更好

更新时间:2017-04-28 13:54:10浏览次数:1+次

        今天,我在看<<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 里的偏移而已。那么从这个角度来说,它至少是非典型的指针。