我的课程定义如下:
class A
{
public:
A()
{
fp = &A::f;
}
void (A::*fp)();
void f()
{
cout << "A::f()" << endl;
}
};
在main函数中,我定义了A类的对象,我想调用a.fp()。但是,我发现我无法使用a.fp()
或(a.fp)()
执行此操作。最后,(a.*a.fp)()
,从语法的角度来看,这是完全奇怪的。
int main()
{
A a;
(a.*a.fp)();
return 0;
}
有人可以解释(a.*a.fp)()
实际意味着什么以及为什么(a.fp)()
不起作用?
答案 0 :(得分:5)
让我们添加括号以使分组显式:
( a.*(a.fp) )()
a.fp
定期访问fp
内的指向成员a
的指针。 a.*(...)
使用指向成员访问运算符的指针,通过间接检索成员函数。
(...)()
对(...)
中的“可调用”表达式执行函数调用。
至于为什么(a.fp)()
不起作用。这是因为指向成员的指针不像常规指针。您需要将它们应用于对象,即类的实例。因此a.fp
仅检索指向成员的指针,该指针本身不是可调用类型。如果不应用于对象,则无法调用它,.*
生成可调用表达式所实现的目标。
答案 1 :(得分:1)
此代码以两种不同的方式访问a
对象,用于两个不同的目的。要更好地理解它,您需要将两者分开。
通过指向成员函数的指针调用成员函数需要.*
或->*
,具体取决于您是否有实际对象或指向对象的指针:
void (A::*afp)() = &A::f;
A a;
(a.*afp)(); // calls A::f on the `a` object
A* ap = &a;
(ap->*afp)() // calls A::f on the `a` object
当指向成员函数的指针是该类的成员时,您必须访问具有通常的类成员访问权限的指针。也就是说,a.fp
是对象a
中指向成员的函数。因此,结合这两者,(a.*a.fp)()
调用a
所指向的a.fp
的成员函数,并在a
对象上调用它。
答案 2 :(得分:1)
a.fp
是指向成员函数的指针,其中&#34;指针&#34;应该在一般意义上理解&#34;某种基于对象的间接&#34;
指针不知道A
的任何实例 - 你需要一个对象,它可以被解除引用&#34;相对于。
也就是说,您还需要a
。
取消引用相对于p
的任何成员指针a
看起来像a.*p
。
(.*
看起来像两个运算符,但它实际上只是一个,#34;指向成员的解引用运算符&#34;)。
由于您的成员函数指针为a.fp
,因此取消引用语法为a.*(a.fp)
,或更精简,a.*a.fp
。
然后你需要将这一束包装在括号中(出于优先原因),你得到
(a.*a.fp)()
旁注:以下内容也有效:
void (A::*function)() = &A::f;
A a;
(a.*function)();
A b;
(a.*b.fp)();
并做同样的事情。
答案 3 :(得分:1)
(a.*a.fp)();
a the instance a
a.fp the member of a which is a pointer to member function
*a.fp dereferencing the member function pointer
(a.*a.fp)() invoking the member function on a
最后两步实际上是一个(.*
是一个运算符)。通常,如果mem_fun
是成员fucntion指针,则调用它的语法是
(a.*mem_fun)();
另见here。