【问题标题】:why can't we create our own ostream object为什么我们不能创建自己的 ostream 对象
【发布时间】:2012-04-21 17:46:24
【问题描述】:

如果 cout 是 ostream 类的对象,那为什么我们不能声明我们自己的对象,比如说,'out' 来自同一个类。即,下面的代码不应该工作吗??

#include<iostream>
using namespace std;
int main()
{
    ostream out;
    out<<"something";
}

否则

#include<iostream>
using namespace std;
int main()
{
    ostream_withassign out;
    out<<"something";
}

【问题讨论】:

  • 它会做什么?输出会去哪里?
  • ostream_withassign 应该是什么?
  • 为什么你认为不可能做到?
  • @David Schwartz 输出应该像 cout 一样进入标准输出
  • 为什么会进入标准输出?代码中的什么指定它应该转到标准输出?标准输出是一个特定的目的地,它不是默认值。

标签: c++ class object iostream


【解决方案1】:

流对象需要一个缓冲区来将数据发送到外部设备。标准输出流对象std::cout 使用缓冲区进行初始化,该缓冲区将传输封装到输出出现的任何位置。这是一个人为的例子:

std::ostream cout(/* buffer */);

要让你自己的流对象伪装成标准流对象,你可以简单地将std::cout 的缓冲区传递给它的构造函数。请注意,我不建议在实践中这样做:

std::ostream copy(std::cout.rdbuf()); // Note: not a *real* copy

copy << "Hello World";

【讨论】:

    【解决方案2】:

    你没有设置ostream对象(这个流输出到什么),当然不能用。 http://www.cplusplus.com/reference/iostream/ostream/ostream/

    // ostream constructor
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main () {
      filebuf fb;
      fb.open ("test.txt",ios::out);
      ostream os(&fb);
      os << "Test sentence\n";
      fb.close();
      return 0;
    }
    

    【讨论】:

    • 我们如何让这段代码像 cout 一样将输出发送到标准输出?
    • @user - 我们不能不使用一些操作系统特定的知识。这就是我们在标准库中已经有了cout 的原因。
    • @user1232138 您可以从ostream 派生并将couts rdbuf() 作为ostream 的构造函数参数传递。不过,我不确定这是否是个好主意。
    【解决方案3】:

    ostream 类派生自 ios 类。 ios 类的构造函数如下所示。

    public: explicit ios (streambuf* sb);
    protected: ios();
    

    这意味着 ios 的默认构造函数受到保护,因此您不能使用 ostream 的默认构造函数创建对象。

    创建 ostream 对象的唯一方法是使用 streambuf sb* 参数。

    std::ostream my_obj(std::cout.rdbuf());
    

    同样,您不能按值传递 ostream 对象。

    原因

    ios 是从 ios_base 派生的。 它的复制构造函数是私有的。

    protected: ios_base();    
    private: ios_base (const ios_base&);
    

    【讨论】:

      【解决方案4】:

      你只能这样做:

      #include <iostream>
      
      std::ostream& gvar = std::cout << "Hello world" << std::endl;
      
      int main() {} 
      

      来自: http://xazax.web.elte.hu/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2019-04-07
        • 2022-08-08
        • 1970-01-01
        相关资源
        最近更新 更多