10

我正在为一个虚拟 rolodex 做一个家庭作业项目,它需要一个主类、一个 rolodex 类和一个卡片类。要将所有“卡片”的内容输出到控制台,分配说 main() 应该调用 rolodex 类中的 show(...) 函数,将其传递给 ostream 和 show(...) 然后迭代在卡片上,调用它们的每个 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 传递到流中?

4

2 回答 2

14

我不明白为什么 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.
}
于 2011-04-01T00:24:48.133 回答
3

我只会重载<<运算符:

class Card{
public:
    friend ostream& operator<<(ostream& os, const Card& s);
};

ostream& operator<<(ostream& os, const Card& s){
    os << "Print stuff";
    return os;
}

你也可以在 Rolodex 中重载以迭代卡片。

于 2015-12-06T20:39:31.277 回答