C ++将ostream作为参数传递

时间:2011-04-01 00:20:10

标签: c++ parameter-passing ostream

我正在为虚拟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传递到流中?

2 个答案:

答案 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中重载,只是迭代卡片。