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

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

summaryReport() 是一个无返回值的函数,但是它给我报错:

没有符合这些操作数的运算符"<<"

如果我将 summaryReport 函数更改为 int,那么错误就不会出现了,但我遇到的问题是必须返回一个值,而且它要在屏幕上打印出来。

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

有没有办法使用void函数重载cout<<?
4个回答

11

你应该按照这里的示例,定义以 ostream& 为参数的 summartReport

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!
}

顺便说一下,它不叫做"overloading cout"。你应该说"为std::ostream重载operator<<"。


0
如果你重载了cout,可能会使一些其他使用code的地方难以理解或更加混乱。实际上,你可以自己创建一个类来完成这项工作。例如,创建一个名为class MyPrint的类,并重载它的operator <<

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并断言它提供了正确的输出。

0

你的存储报告隐式地始终流向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 函数设为 storage 类的 friend。
friend ostream& operator<<(ostream& osObject, const storageRentals& rentals);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接