如果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";
}
答案 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() {}