为什么我们不能创建自己的ostream对象

时间:2012-04-09 10:11:58

标签: c++ class object iostream

如果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";
}

4 个答案:

答案 0 :(得分:5)

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

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

要创建自己的流对象,假装是标准流对象,您只需将std::cout的缓冲区传递给它的构造函数即可。请注意,我不建议在实践中这样做:

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

copy << "Hello World";

答案 1 :(得分:0)

您没有设置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;
}

答案 2 :(得分:0)

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&);

答案 3 :(得分:-1)

您只能这样做:

#include <iostream>

std::ostream& gvar = std::cout << "Hello world" << std::endl;

int main() {} 

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