在函数中返回2个值

dis*_*dia 0 c++

我试图在读取文件时返回值(即行和列),因为我将读取多个文件并从每个文件中获取相同的变量,我认为编写函数而不是复制更好并粘贴重复的代码.

无论如何,我试图返回2个值并使用它们,请参阅下面的代码:

#include <iostream>
#include <fstream>

using namespace std;

int r(string fn);

int main()
{
    int a, b = r("input_a.txt");

    cout << "a --- " << a << endl;
    cout << "b --- " << b << endl;

}

int r(string fn)
{
    ifstream fin01;
    string file = fn;

    fin01.open(file.c_str());

    ...
    ...
    ...

    // Suppose I should be getting 2 for 'rows' and 3 for 'cols'
    return rows, cols;
}
Run Code Online (Sandbox Code Playgroud)

0x7fff670778ec0x7fff670778e8我的输出,而不是...

有什么指针吗?

for*_*818 6

您不能从声明为具有int返回类型的函数返回两个值:

int r(string fn){
    /*...*/
    return rows,cols;  // <-- this is not correct
}
Run Code Online (Sandbox Code Playgroud)

您调用此函数的方式也不像您预期​​的那样:

int a, b = r("input_a.txt");
Run Code Online (Sandbox Code Playgroud)

这声明了两个整数并用函数的返回值初始化第二个整数,但第一个保持未初始化(有关逗号运算符的更多解释,请参阅TerraPass答案).

你基本上有两个选择.第一个选项是传递对函数的引用,函数将结果分配给这些引用:

void r(string fn, int& rows,int& cols) {
    /*...*/
    rows = x;
    cols = y;
}
Run Code Online (Sandbox Code Playgroud)

你这样称呼它:

int a,b;
r("someString",a,b);
Run Code Online (Sandbox Code Playgroud)

但是,通过这种方式,调用者必须"准备"那些返回值.Imho使用返回值返回函数的结果更方便(听起来合乎逻辑,没有?).要做到这一点,你只需要定义一个封装两个整数的类型:

struct RowAndCol { int row;int col; };

RowAndCol r(string fn) {
    /*...*/
    RowAndCol result;
    result.row = x;
    result.col = y;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

RowAndCol rc = r("someString");
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以使用a std::pair<int,int>而不是定义自定义结构(请参阅例如molbdnilos answer).但是,恕我直言,只要你确切地知道对中包含的内容,最好给它一个合理的名称(例如RowAndCol),而不是使用裸体std::pair<int,int>.这也可以帮助您以后需要向结构添加更多方法(例如,您可能希望重载std::ostream& operator<<结构以在屏幕上打印它).

PS:实际上你的输出看起来不像是你所展示的代码产生的.这些是一些内存地址,但在您的代码中既没有指针也没有地址操作符.