重载<< std :: ostream的运算符

时间:2012-04-24 03:33:07

标签: c++ overloading

ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{
    osObject << rentals.summaryReport();
    return osObject;
}

summaryReport()是一个void函数,它给了我一个错误:

  

无操作员“&lt;&lt;”匹配这些操作数

但如果我将summaryReport函数更改为int,则错误不存在,但我遇到的问题是您必须返回一个值,并将其打印出来屏幕。

void storageRentals::summaryReport() const
{
   for (int count = 0; count < 8; count++)
      cout << "Unit: " << count + 1 << "    " << stoUnits[count] << endl;
}

有没有办法用void函数重载cout <<

4 个答案:

答案 0 :(得分:10)

您应该将summartReport定义为ostream&作为参数,如下所示:

std::ostream&  storageRentals::summaryReport(std::ostream & out) const
{
    //use out instead of cout
    for (int count = 0; count < 8; count++)
        out << "Unit: " << count + 1 << "    " << stoUnits[count] << endl;

    return out; //return so that op<< can be just one line!
}

然后将其称为:

ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{
    return rentals.summaryReport(osObject); //just one line!
}

顺便说一下,它不叫“重载cout”。您应该说,operator<< 重载std::ostream

答案 1 :(得分:0)

这里有两件事你需要做。让storageRentals::summaryReport()获取std::ostream&(您可以默认此为std::cout):

void storageRentals::summaryReport(std::ostream& os) const
{
    for (int count = 0; count < 8; count++)
    {
        os << "Unit: " << count + 1 << "    " << stoUnits[count] << endl;
    }
}

然后这样称呼它:

ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{
    rentals.summaryReport(osObject);
    return osObject;
}

注意:使storageRentals::summaryReport()获取std::ostream&的一个好处是,您可以在单元测试中将std::ostringstream传递给它,并声明它提供了正确的输出。

答案 2 :(得分:0)

如果你重载cout,你可能会使用code难以理解,或者更令人困惑的其他地方。事实上,你可以自己上课来完成这项工作。例如制作课程class MyPring,并重载operator <<

答案 3 :(得分:0)

您的存储报告会始终流式传输到cout。 想象一下有人用这种方式调用你的函数并在cout而不是文件上租借。

fstream fs("out.txt");
storageRentals rentals;
fs << rentals;

为什么不像这样流式传输你的课程:

ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{

  for (int count = 0; count < 8; count++) {
      osObject << "Unit: " << count + 1 << "    " << rentals.stoUnits[count] << endl;
  }
  return osObject;
}

如果stoUnits成员是私有的,则需要使stream函数成为存储类的朋友。

friend ostream& operator<<(ostream& osObject, const storageRentals& rentals);