能否将cout或fout传递给函数?

25

我正在尝试寻找一种将fout或cout传递给函数的方法。我意识到有逻辑上简单的处理方式,比如在任何输出数据的函数中放置if语句,甚至只是编写两种功能的函数。但是,这似乎是原始和低效的。我不相信这个代码会起作用,我把它放在这里只是为了确保很容易看到我想做什么。请注意,我正在使用C++算法设计课程学习,我并不是一个经验丰富的C++程序员。我的课程限制了使用您所看到的头文件。

#include <iostream>
#include <iomanip>
#include <fstream>

using namespace std;
void helloWorld(char);
ofstream fout;

int main()
{
    fout.open("coutfout.dat");
    helloWorld(c);
    helloWorld(f);

    return 0;
}
void helloWorld(char x)
{
    xout << "Hello World";
    return;
}
2个回答

46

两者都继承自 ostream,因此尝试这样做:

void sayHello(ostream& stream)
{
    stream << "Hello World";
    return;
}

然后在主函数中,传入对象(cout或其他)即可正常工作。


它能运行!我知道它没有我想象的那么难。非常感谢你! - ChiefTwoPencils
3
没问题。请查看http://en.cppreference.com/w/cpp/io/basic_ostream获取基类信息。 - Kevin Anderson
@Kevin 在阅读了你提供的链接后,我认为该函数应该返回给定的 stream 参数... std::ostream& sayHello(std::ostream& stream){return stream << "Hello World";} - GingerPlusPlus
1
@GingerPlusPlus - 如果你想覆盖输出运算符或允许其链接,那么这是一致的,但这只是一个简单的“仅输入”类型的事情。你建议的做法肯定没有害处,但在我看来也不是“重要”的。 - Kevin Anderson

13

可以。让你的函数为

sayhello(std::ostream &os);
然后,在函数中,您可以使用os代替xout。(顺便说一句,using namespace std会导入整个std名称空间,不建议使用。但是using std::cout之类的是可以的。)

谢谢。我注意到这种格式似乎是惯例。那么,using std::cout是否创建了一个“快捷方式”,使得可以使用cout,但保留std命名空间的其余部分不变? - ChiefTwoPencils
@RobertoWilko:没错。using std::cout将名称cout引入当前命名空间以供立即使用(顺便说一句,这意味着如果有一个本地变量名为cout,则您无法访问它)。 - thb
如果你将一个名为cout的变量,那么无论如何都会搞砸代码。 - Íhor Mé

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接