【问题标题】:Is it possible to pass cout or fout to a function?是否可以将 cout 或 fout 传递给函数?
【发布时间】:2012-05-08 12:52:18
【问题描述】:

我正在尝试找到一种将 fout 或 cout 传递给函数的方法。我意识到有一些逻辑上简单的方法来处理这个问题,比如将 ifs 放在任何输出数据的函数中,甚至只是双向编写函数。然而,这似乎原始且低效。我不相信这段代码会起作用,我把它放在这里是为了确保很容易看到我“想要”做什么。请注意,我正在学习使用 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;
}

【问题讨论】:

    标签: c++ fstream ofstream


    【解决方案1】:

    这两个都继承自 ostream 所以试试这个:

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

    然后在 main 中,传入对象(cout 或其他),它应该可以正常工作。

    【讨论】:

    • 有效!我知道这不可能像我做的那么难。非常感谢!
    • 没问题。查看 en.cppreference.com/w/cpp/io/basic_ostream 的基类。
    • @Kevin 阅读您提供的链接后,我认为该函数应返回stream 作为参数... std::ostream&amp; sayHello(std::ostream&amp; stream){return stream &lt;&lt; "Hello World";}
    • @GingerPlusPlus - 如果您想要覆盖输出运算符,或者允许它被链接,这是一致的,但这是一个简单的“仅输入”类型的事情。做你的建议当然没有坏处,只是在 IMO 中也不“重要”。
    【解决方案2】:

    是的。让你的功能是

    sayhello(std::ostream &os);
    

    然后,在函数中,您可以使用os 代替xout

    (顺便说一句,using namespace std 会转储整个 std 命名空间,不推荐使用。不过,using std::cout 之类的也可以。)

    【讨论】:

    • 谢谢。我注意到格式似乎是惯例。那么,using std::cout 是否创建了一个“快捷方式”,可以使用cout,但保留 std 命名空间的其余部分?
    • @RobertoWilko:没错。 using std::cout 将名称 cout 引入当前命名空间以供立即使用(顺便说一下,如果有一个名为 cout 的局部变量,您将无法同时访问该变量)。
    • 如果你要创建一个名为 cout 的变量,那么无论如何你都会对代码进行修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2015-05-11
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多