重载<<输出地图的key_type和mapped_type

时间:2016-03-11 09:50:08

标签: c++ operator-overloading

我有一个课程目录类,其中包含map<string, string> Courses类型的私有变量。我希望将<<重载为友元运算符,以便在输出实例Courses["TMA4100"]时,它将输出"TMA4100"和课程名称,而不仅仅是名称。原因是我可以将目录存储在一个文件中,而不是在关闭程序时删除目录。

我对地图不太熟悉,所以我真的不知道如何重载操作员来处理地图。这是我最初的尝试:

std::ostream &operator << (std::ostream &outStream, const string coursecode){
outStream << coursecode << " " << Courses[coursecode];}

现在我已经考虑过了,这根本没有多大意义,因为我不会将字符串传递给运算符,而是带有密钥的地图。任何人都可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:4)

要存储整个目录,请为您自己的类重载运算符,而不是为地图或字符串重载。

示例:

std::ostream& operator<<(std::ostream& os, const YourClass& catalog)
{
    for (const auto& entry: catalog.Courses)
    {
        os << entry.first << " " << entry.second << '\n';
    }
    return os;
}

有关入门访问的建议:

为了增加灵活性,请创建一个包含课程信息的类,并存储这些信息而不是字符串:

struct CourseInfo
{
    std::string name;
    std::string description;
    StaffMember teacher;
    // ... more useful stuff ...
};

您的目录现在是std::map<string, CourseInfo>,您可以为<<重载CourseInfo

std::ostream& operator<<(std::ostream& os, const CourseInfo& info)
{
    os << info.name << " " << info.description << " " << info.teacher;
    return os;
}

你可以写(为你的班级使用虚构的界面):

YourClass catalog;
// ... populate the catalog
std::cout << catalog.courseInfo("TM4100") << std::endl;