返回struct array c ++

时间:2016-05-22 09:38:48

标签: c++ struct

我试图从函数返回一个结构,但是我收到了错误:

  

[错误]无法转换'(数据*)(& data)'来自' Data *'到'数据'

这是我的结构:

struct Data
{
    string id, marc, model;
};

这就是我实际上要做的就是返回结构:

Data ReadFile (string file)
{
Data data[200];
ifstream in;
in.open(file.c_str(), ios::in);
if(!in) 
{
    cout<<"Error"<<endl;
    main();
}
else
{
    int i=0;
    while(getline(in, data[i].id, '\n'))
    {
        getline(in, data[i].marc, '\n');
        getline(in, data[i].model, '\n');
        i++;
    }
    in.close();
    cout<<"End"<<endl;
    main();
}
return data;
}

那么,返回结构的最佳方法是什么,我在其他函数中需要它, 感谢。

1 个答案:

答案 0 :(得分:0)

让我们考虑一下你的功能结构:

Data ReadFile (string file)
// ^ this function returns a 'Data' class
{
    Data data[200];
    // ^^^^^^^^^^^ here you declare a LOCAL array of 200 'Data's
    // ... stuff ...
    return data;
    //     ^^^^ here you try to return a 'Data*' 
}

这里有两个问题(更不用说任何设计考虑):

  • 您正在尝试返回指针而不是函数声明所预期的单个结构。

  • 数组&#39;数据&#39;是本地的,其寿命仅限于函数的范围。

现在,您可以通过为数组动态分配内存来修复这些问题,在将函数的返回值更改为指针之后返回该指针(并记住在某处删除),但我建议的是使用std::vector并将所有内存管理留给标准库类。

std::vector<Data> ReadFile(std::string file)
{
    std::vector<Data> data;
    std::ifstream in{file};
    if ( !in ) 
    {
        cout << "Error opening file " << file << std::endl;
    }
    else
    {
        // Now, it's not clear how data are stored in your file.
        // Assuming something like:
        //   
        //   id1
        //   marc1
        //   model1
        //   id2 
        //   ...
        Data tmp;
        while(    getline(in, tmp.id) 
               && getline(in, tmp.marc)
               && getline(in, tmp.model) )
        {
            data.push_back(tmp);
        }
        std::cout << data.size() << " Data structs succesfully read.\n";
    }
    return data;
}