我写了一个读入map
的课程。但我需要在课堂外编辑地图。所以我的问题是如何返回map
。
class ReadMap
{
string fileName;
public:
//constructors and destructor
ReadMap(){fileName="blank.txt";}
ReadMap(string name){fileName=name;}
~ReadMap(){}
//Function to print out visible list
void show()
{
LineDatabase Entry;
int LineNumber=100;
string buffer;
ifstream myfile (fileName.c_str() );
while (myfile.good())
{
myfile >> LineNumber >> ws;
getline (myfile, buffer);
Entry.insert(pair<int, string>(LineNumber, buffer));
cout <<buffer << endl;
}
//return Entry;
}
};
答案 0 :(得分:4)
通过让show()的调用者传入对要填充的地图的引用,你可能会更好,因为返回地图往往会有很高的开销。像这样:
void show(LineDatabase& Entry) {
// do your map readin logic
return;
}
答案 1 :(得分:1)
使用return
关键字返回地图,就像返回其他内容一样。如果您想知道为什么您的评论return
不起作用,那是因为您将show()
声明为返回void
。将void show()
更改为LineDatabase show()
。
另外,尝试将变量和类型名称保持为小写。典型的惯例是使用大写名称作为模板参数,因此阅读时有点令人困惑。
答案 2 :(得分:1)
有4种选择。
最简单的选择是更改show的返回类型并取消注释你的返回,但是这将返回map值,这将涉及一个副本,并且可能(取决于大小)非常低效 (可能很危险,取决于LineDatabase的复制操作符)。
LineDatabase show()
{
LineDatabase Entry;
// .... ommited
return Entry;
}
第二个选项是按照user258808的建议执行并创建一个新对象然后通过指针返回它,这种方法的问题是你的客户端必须知道在这个指针上调用delete 完成后,否则会造成泄漏。
第三个选项是将Entry作为ReadMap的一个字段,然后返回一个引用。 这是我个人的偏好,因为它给客户带来的负担最小,但是它也可能要求您在每次新的运行之前“重置”条目。 像这样的东西
class ReadMap
{
string fileName;
LineDatabase Entry;
public:
//constructors and destructor
ReadMap(){fileName="blank.txt";}
ReadMap(string name){fileName=name;}
~ReadMap(){}
//Function to print out visible list
LineDatabase& show()
{
int LineNumber=100;
string buffer;
ifstream myfile (fileName.c_str() );
while (myfile.good())
{
myfile >> LineNumber >> ws;
getline (myfile, buffer);
Entry.insert(pair<int, string>(LineNumber, buffer));
cout <<buffer << endl;
}
return Entry;
}
};
这个问题是将你的内部状态暴露给修改,可以返回一个const引用但是客户端不能修改Map。
最后,你可以按照bodes的建议去做。但是,这需要客户端传入Map以供您使用。
您的选择取决于您希望客户做多少工作,以及您需要和/或不需要在数据结构上放置哪些约束。