C++将ostream作为参数传递

Chr*_*isM 9 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;
}
Run Code Online (Sandbox Code Playgroud)

而不是像这样的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

我是误解了使用ostream作为参数还是错过了一些其他明显的理由将流pass传递到流中?

Bil*_*eal 13

我不明白为什么ostream应该/应该通过任何地方.

这通常用于测试等事情.假设你想要正常的控制台输出,所以你要传递一个引用std::cout.但有时您想要进行测试,例如单元测试或验收测试,并且您希望将输出存储在内存中.您可以使用std::stringstream此功能,而您正在使用的功能并不明智.

这是一个特定的情况 - 但通常在任何你想要改变数据源或接收器可能来自/去往的地方,你可以通过传递流来做到这一点.

例如,以下内容将您的rolodex打印到控制台:

int main()
{
    Rolodex myRolodex;
    myRolodex.show(std::cout);
}
Run Code Online (Sandbox Code Playgroud)

...但是如果明天你想要写一个文件,你可以这样做而不会影响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.
}
Run Code Online (Sandbox Code Playgroud)