【发布时间】:2020-03-15 09:59:54
【问题描述】:
我对如何使用指向成员数据本身的成员函数的指针有些困惑:
struct Foo
{
void bar(int x)
{
cout << x << endl;
}
double getVal(double d)
{
return ++d;
}
void(Foo::*pMemFunc)(int) = &Foo::bar;// ptr to mem func
int(Foo::*pMemI) = &Foo::val_;// ptr to mem data
int* pI = &val_;
int val_ = 57;
};
int main()
{
Foo f, *pF = new Foo{};
double(Foo::*pMemFun)(double) =
&Foo::getVal;
cout << (f.*pMemFun)(3.14) << endl;// dereferencing a pMemFun yields a the member getVal so we need an object or pointer to call it.
cout << (pF->*pMemFun)(2.08) << endl;// through pointer to Foo obj
f.Foo::pMemFunc = &Foo::bar;
// f.Foo::pMemFunc(5);// how to use this?
cout << "\nDone!\n";
}
所以pMemFunc 是一个指向成员函数的指针,但指针本身是类Foo 的成员数据,那么我该如何调用它指向的成员函数呢?
我尝试过这样的事情:
f.(*f.pMemFunc)(0);
但它不起作用。我发现更难的是访问该成员必须通过一个对象,例如 f.pMemFunc 或 pF->pMemFunc 然后取消引用它会产生一个需要一个对象来调用它的成员函数,所以我尝试:f.(*f.pMemFunc)(10); 但我得到编译时错误.
请说明如何操作。谢谢!
-
经过多次尝试,我终于以某种方式让它工作了:将表达式分解为多个部分:
auto ret = f.pMemFunc; // 1 (f.*ret)(0);// 2. works fine
但是请解释为什么现在它可以工作以及会发生什么?!
【问题讨论】:
-
第一次和第二次尝试的区别在于你如何设置括号。
标签: c++ pointer-to-member