在通过该类

时间:2017-10-19 11:36:10

标签: c++

我的课程定义如下:

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)()不起作用?

4 个答案:

答案 0 :(得分:5)

让我们添加括号以使分组显式:

( a.*(a.fp) )() 
  1. a.fp定期访问fp内的指向成员a的指针。
  2. a.*(...)使用指向成员访问运算符的指针,通过间接检索成员函数。

  3. (...)()(...)中的“可调用”表达式执行函数调用。

  4. 至于为什么(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