C 类内部结构和两个呼叫同时

C++ Class inside Structure and two callings at the same time

本文关键字:两个 呼叫 内部 结构      更新时间:2023-10-16

在网中某个地方查看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 ,那么我也会遇到错误。 void operator()(int x1, int y1) addoption 之后被调用,但最终G.x和G.y都具有值3而不是值。

那么,有人可以解释我在这里到底发生了什么?

您的语句

t1.addOptions()(5,5);

基本上是这样的工作:

{
    mypair temp_variable = t1.add_options();
    temp_variable(5, 5);
}

请注意,由于myrot::addOptions返回 mypair对象 by value ,因此在myrot::g成员变量的A copy 上调用mypair::operator()函数。如果要修改myrot::g变量,则必须通过参考:

返回
mypair& addOptions() { ... }

然后等效代码变为

{
    mypair& temp_variable = t1.add_options();
    temp_variable(5, 5);
}

如果我删除了成员函数addoptions中的返回类型,则会获得错误。

如果将addoptions返回类型更改为void,则不会返回,您将会收到错误,因为没有什么可以拨打操作员((。

也是t1.addoptions(((5,5(;将更改为res = t1.addoptions(((5,5(;在哪里宣布RES为mypair,然后我也会遇到一个错误。

这里是另一种方式。您声明了(( - 操作员返回void。因此,在Res中没有任何保存。

这只是方法的串联。

顺便说一句,您的班级名称应从大写字母开始。并且您的参数应声明为X和Y,以及您的类成员_x和_y或我喜欢的内容:

void operator()(int x, int y) {
    this->x = x; 
    this->y = y;
    cout << "x=" << x << "  y=" << y << endl;
}