我试图从函数返回一个结构,但是我收到了错误:
[错误]无法转换'(数据*)(& 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;
}
那么,返回结构的最佳方法是什么,我在其他函数中需要它, 感谢。
答案 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;
}