14

如果 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

4 回答 4

10

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

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

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

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

copy << "Hello World";
于 2014-01-21T20:41:30.497 回答
1

你没有设置 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;
}
于 2012-04-09T10:16:32.597 回答
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&);
于 2016-09-14T08:55:34.973 回答
-1

你只能这样做:

#include <iostream>

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

int main() {} 

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

于 2020-09-16T21:41:52.977 回答