了解指向成员的运营商

时间:2011-12-19 06:15:12

标签: 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;
}

3 个答案:

答案 0 :(得分:1)

问题是由于op-> *pf处的额外空白

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

我认为@fefe可能已经说出了评论的原因。 ->*是单个运算符,类似于.*。因此,如果这两个是分开的,那么它将导致不同的语法,这会给编译器错误。

答案 1 :(得分:1)

看看Pointer to class data。对于错误, - &gt; *是一个运算符,您不能在它们之间放置空格。

答案 2 :(得分:1)

iammilind打赌我错了;必须更改op-> *pf,以便您将->*作为单个运算符组合在一起 - pointer to member operator(找不到更好的链接)。 op ->* pf中的空格完全有效。

i++之类的内容也是如此; ++是单个运算符,如果您尝试i+ +,则会导致错误。

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

内部main

  • n属于M类型,因此,为了使用pf来调用set_xy的{​​{1}},您需要使用n .* 1}}运算符:(n.*pf)(10, 20);。这相当于n.set_xy(10, 20);

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

内部sum

  • 这些示例只是指向成员/实例变量的指针,而不是成员函数。它只是演示了如何使用这些类型的指针将m.xm.y加在一起。