我正在为虚拟rolodex做一个家庭作业项目,该项目已经调用了主类,rolodex类和卡类。要将所有“卡”的内容输出到控制台,赋值表示main()应该在rolodex类中调用show(...)函数,并将其传递给ostream并显示(...)然后迭代通过卡片,调用每个showCard()函数。实际显示由卡片对象的showCard()函数完成,显示在提供的ostream上。
我不明白为什么ostream会/应该被传递到任何地方。似乎作业要求这样的东西:
main() {
Rolodex myRolodex;
ostream myStream;
myRolodex.show(myStream);
}
void Rolodex::show(ostream& theStream) {
//for each card 'i' in the Rolodex...
myCard[i].show(theStream);
}
void Card::show(ostream& theStream) {
theStream << "output some stuff" << endl;
}
而不是像这样:
main() {
Rolodex myRolodex;
myRolodex.show(); //no ostream passed
}
void Rolodex::show() {
//for each card 'i' in the Rolodex...
myCard[i].show();//no ostream passed
}
void Card::show() {
cout << "output some stuff" << endl;
}
我是否误解了使用ostream作为参数或者错过了其他一些明显的理由将ostream传递到流中?
答案 0 :(得分:13)
我不明白为什么ostream会/应该被传递到任何地方。
这通常用于测试等事情。假设你想要正常的控制台输出,所以你要传递对std::cout
的引用。但有时你想做测试,例如单元或验收测试,并且您希望将输出存储在内存中。您可以使用std::stringstream
,而您正在使用的功能并非更明智。
这是一个特定情况 - 但一般来说,如果您想要更改数据源或接收器可能来自/去往的地方,您可以通过传递流来实现。
例如,以下内容会将rolodex打印到控制台:
int main()
{
Rolodex myRolodex;
myRolodex.show(std::cout);
}
...但是如果明天你想要写一个文件,你可以这样做而不会影响Rolodex中的代码:
int main()
{
Rolodex myRolodex;
std::ofstream file("This\\Is\\The\\Path\\To\\The\\File.txt");
myRolodex.show(file); // Outputs the result to the file,
// rather than to the console.
}
答案 1 :(得分:2)
我只是重载<<
运算符:
class Card{
public:
friend ostream& operator<<(ostream& os, const Card& s);
};
ostream& operator<<(ostream& os, const Card& s){
os << "Print stuff";
return os;
}
你也可以在Rolodex中重载,只是迭代卡片。