【问题标题】:How do I change a C++ output stream to refer to cout?如何更改 C++ 输出流以引用 cout?
【发布时间】:2011-10-31 00:54:57
【问题描述】:

我有一个类,我想将输出流作为成员提供给它:

class GameBase {
protected:
    ofstream m_OutputWriter;
...
}

这个类中有一个方法,它接受一个字符串参数并打开 m_OutputWriter 以指向该文件,因此可以使用标准 将数据输出到该文件

但是,我想要的是让流默认指向 cout,这样如果没有指定输出路径,输出会转到控制台输出而不是文件,并且它将完全透明调用类,谁会使用

m_OutputWriter << data << endl;

将数据输出到预定的目的地。然而,我在这里尝试了其他几个示例,但似乎没有一个完全适合我正在尝试做的事情。

我在这里错过了什么?

【问题讨论】:

标签: c++ stream cout


【解决方案1】:

为什么流需要成为成员?

struct GameBase {
    void out(std::ostream& out = std::cout);
    // ...
};

【讨论】:

    【解决方案2】:

    除了拥有std::ofstream 作为成员之外,我还会使用一个返回std::ostream&amp; 的函数。

    例如:

    class GameBase {
        std::ofstream m_OutputWriter;
    protected:
        std::ostream& getOutputWriter() {
             if (m_OutputWriter)
                 return m_OutputWriter;
             else
                 return std::cout;
        }
        ...
    }
    

    一个功能齐全的例子:

    #include <iostream>
    #include <ostream>
    
    std::ostream& get() {
        return std::cout;
    }
    
    int main() {
        get() << "Hello world!\n";
    }
    

    【讨论】:

    • 我如何使用指向带有“
    • @Charles - 尽管如此,这是正确的语法;请参阅我附上的示例。您必须提供有关为什么它可能无法编译的更多信息(可能是因为它不是const?您几乎无法避免这种情况,除非您将m_OutputWriter 标记为mutable。)。
    • 好的,我发现了问题,我正在尝试一些愚蠢的事情,因为 m_OutputWriter 有一个非空值。我将测试更改为“if (m_OutputWriter.is_open())”,现在它工作得很好。空括号把我逼疯了,因为我非常喜欢我在 C# 中的属性,但我想它总比没有工作好。感谢您的帮助!
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2011-05-08
    相关资源
    最近更新 更多