C ++类内部结构和两个调用同时进行

时间:2018-02-25 17:27:54

标签: c++ class struct parameter-passing variadic-functions

在网络的某个地方查看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.

那么,有人可以解释一下这里到底发生了什么吗?

2 个答案:

答案 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;
}