c++ - 了解指向成员的指针运算符

标签 c++ pointers compiler-errors dereference pointer-to-member

我从一本 C++ 练习书中复制了这个程序。幕后发生了什么?

预期的输出是:

sum=30 sum=70

#include<iostream>
using namespace std;

class M
{
    int x;
    int y;
public:
    void set_xy(int a, int b)
    {
        x=a;
        y=b;
    }
    friend int sum(M m);
};

int sum (M m);
//so far so good, problem begins from here. what's happening after here?
{                               
    int M ::*px = &M ::x;
    int M ::*py = &M ::y;
    M *pm =&m;
    int s= m.*px+ pm->*py;
    return s;
}

int main()
{
    M n;
    void (M :: *pf)(int, int) = &M ::set_xy;
    (n.*pf)(10, 20);
    cout <<"sum=" << sum(n) << endl;

    M *op= &n;
    (op-> *pf)(30,40);
    cout << "sum=" << sum(n)<< endl;

    cin.ignore();
    getchar();
    return 0;
}

最佳答案

问题是因为 op-> *pf 处的额外空白:

 (op->*pf)(30,40);  // ok

我想@fefe 大概在评论里说了原因。 ->*是一个单一的操作符,类似于.*。因此,如果将这 2 个分开,则会导致不同的语法,从而导致编译器错误。

关于c++ - 了解指向成员的指针运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8557776/

相关文章:

c++ - 为什么它调用 Gameboard gameboard 的析构函数 if (players[p].setcoin(gameboard, input))

c++ - 成员函数指针指向另一个对象的方法

c - C 结构数组上的冒泡排序未正确排序

c++ - 如何摆脱这个构造函数错误?

vba - VBA-编译错误: Expected Function or Variable

c++ - 我如何将十进制转换为二进制?

c++ - 没有大量 getter/mutator 的优雅的面向对象的成员访问

c++ - 从线扫描相机显示线图像的最快算法或方法是什么

c - 结构处理和结构数组

c - 这个函数的原型(prototype)看起来如何才能可编译?