在网上某个地方看C++代码时,我注意到了一段这样的代码
opts.addOptions()(cOSS.str(), m_list, XYentry());
我对该代码的实现方式印象深刻,当然也想知道它是如何工作的。
所以我试图复制这种类型的调用:
#include "stdafx.h"
#include "iostream"
using namespace std;
class mypair {
public:
int x;
int y;
mypair() {
x = 0;
y = 0;
}
void operator()(int x1, int y1) {
x = x1;
y = y1;
cout << "x=" << x << " y=" << y << endl;
}
};
struct myrot {
int left;
int right;
int result;
mypair g;
mypair addOptions() {
g.x = 3;
g.y = 3;
cout << "g.x=" << g.x << endl;
cout << "g.y=" << g.y << endl;
return g;
};
void print_mypair() {
cout << "g.x=" << g.x << endl;
cout << "g.y=" << g.y << endl;
}
void operator()(int y) { result = y; }
void operator() (void) {
cout << "g.x=" << g.x << endl;
cout << "g.y=" << g.y << endl;
}
};
int main()
{
myrot t1;
mypair res;
t1.left = 2;
t1.right = 5;
t1.addOptions()(5,5);
t1.print_mypair();
cout << "t1.g.x=" << t1.g.x << endl;
return 0;
}
至少在语法级别上,调用
t1.addOptions()(5,5);
似乎几乎相同。所以我的问题是:1)有没有这种 call 的名称?
2)它是如何工作的?如果删除成员函数addOptions中的返回类型,则会收到错误消息。另外,如果将
t1.addOptions()(5,5);
更改为res = t1.addOptions()(5,5);
,其中res被声明为mypair,那么我也会收到错误消息。在addOption之后调用void operator()(int x1, int y1)
,但最后g.x和g.y的值均为3而不是值5。那么,有人可以解释一下这里的实际情况吗?
最佳答案
您的声明
t1.addOptions()(5,5);
基本上是这样的:
{
mypair temp_variable = t1.add_options();
temp_variable(5, 5);
}
注意,由于
myrot::addOptions
按值返回mypair
对象,因此在mypair::operator()
成员变量的副本上调用myrot::g
函数。如果要修改myrot::g
变量,则必须通过引用返回:mypair& addOptions() { ... }
然后,等效代码变为
{
mypair& temp_variable = t1.add_options();
temp_variable(5, 5);
}