从C ++类返回一个映射

时间:2011-05-19 22:34:40

标签: c++ class map

我写了一个读入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;
    }
};

3 个答案:

答案 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以供您使用。

您的选择取决于您希望客户做多少工作,以及您需要和/或不需要在数据结构上放置哪些约束。