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 <<
?
答案 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);