我从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;
}
答案 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.x
和m.y
加在一起。