6

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

预期的输出是:

总和=30 总和=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;
}
4

3 回答 3

1

问题是因为在处有额外的空格op-> *pf

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

我认为@fefe 可能已经在评论中说明了原因。->*是单个运算符,类似于.*. 因此,如果将这 2 个分开,则会导致语法不同,从而导致编译器错误。

于 2011-12-19T06:22:32.293 回答
1

看一下指向类数据的指针。对于错误, ->* 是一个运算符,您不能在它们之间放置空格。

于 2011-12-19T06:26:37.873 回答
1

iammilind 和我打赌这个错误;op-> *pf必须进行更改,以便您可以将->*它们作为单个运算符一起使用 -指向成员运算符的指针(找不到更好的链接)。中的空格op ->* pf是完全有效的。

这对于类似的东西是一样的i++++是单个运算符,如果您尝试使用 . 会导致错误i+ +

现在看看它在做什么。该示例是指向成员函数的指针。pf被声明为 的成员函数class M,它接受两个int具有void返回类型的参数。它被初始化为指向该M::set_xy函数。

内部main

  • n是 type M,因此为了使用pfto call set_xyofn你会使用.*operator: (n.*pf)(10, 20);。这相当于n.set_xy(10, 20);.

  • 由于opis 类型M*(指向M对象的指针),您需要使用运算符并调用as:->*指向的函数,这相当于pf(op->*pf)(30, 40);op->set_xy(30, 40);

内部sum

  • 这些示例只是指向成员/实例变量的指针,而不是成员函数。它只是演示了如何将它们加在一起m.xm.y使用这些类型的指针。
于 2011-12-19T06:40:21.997 回答