【问题标题】:C++ Passing ostream as parameterC ++将ostream作为参数传递
【发布时间】:2011-07-27 08:20:20
【问题描述】:

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

【问题讨论】:

  • 为了相同,main 中的第二行需要去掉,第三行需要myRolodex.show(std::cout);
  • 在第二个示例中已编辑以删除 ostream 对象,但为什么仍需要将 std::cout 传递给 Card::show()?它不能只使用 cout 吗?或者也许你的意思是两个版本都传递一个ostream(不仅仅是相同的输出)?
  • std::cout 是一个 ostream 对象。传递std::ostream 的想法是让函数不关心它在哪里发送输出。 std::cout 只是 std::ostream 的一个特殊实例。如果你让函数本身使用std::ostream 的一个实例,那么你就失去了参数的意义。

标签: c++ parameter-passing ostream


【解决方案1】:

我只会重载&lt;&lt; 运算符:

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

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

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

【讨论】:

    【解决方案2】:

    我不明白为什么 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.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2011-05-29
      • 2018-09-09
      • 2017-05-30
      相关资源
      最近更新 更多