在网络的某个地方查看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)这种呼叫有名称吗?
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.
那么,有人可以解释一下这里到底发生了什么吗?
答案 0 :(得分:2)
您的陈述
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);
}
答案 1 :(得分:1)
如果我在成员函数addOptions中删除了返回类型,那么我会收到错误。
如果将addOptions返回类型更改为void,则不会返回任何内容,您将收到错误,因为没有任何内容可以调用operator()。
如果t1.addOptions()(5,5);将更改为res = t1.addOptions()(5,5);其中res被声明为mypair然后我也得到一个错误。
这是另一种方式。您声明() - 运算符返回void。所以没有什么可以保存在res。
这只是方法的串联。
顺便说一下,你的班级名字应该以大写字母开头。并且addOption中的参数应声明为x和y,并且您的类成员要么_x和_y,要么我喜欢:
void operator()(int x, int y) {
this->x = x;
this->y = y;
cout << "x=" << x << " y=" << y << endl;
}