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

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

没有运算符 "<<" 匹配这些操作数

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

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

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

4

4 回答 4

11

您应该将summartReporttake定义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.

于 2012-04-24T03:36:41.203 回答
0

您需要在这里做两件事。Make storageRentals::summaryReport()take an 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()注意: make take an 的一个优点std::ostream&是您可以在单元测试中传递它std::ostringstream并断言它提供了正确的输出。

于 2012-04-24T03:38:37.460 回答
0

如果你重载cout,你可能会使其他地方使用code起来难以理解,或者更加混乱。实际上,您可以自己创建班级来完成这项工作。例如创建一个类class MyPring,并重载它的operator <<.

于 2012-04-24T03:42:24.963 回答
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 成员是私有的,您需要使流函数成为您的存储类的朋友。

friend ostream& operator<<(ostream& osObject, const storageRentals& rentals);
于 2012-04-24T03:45:32.580 回答