C++关于ostream的疑问
#include<iostream>#include<fstream>usingnamespacestd;classA{private:ostream*f;//把*删去p...
#include <iostream>
#include <fstream>
using namespace std;
class A{
private:
ostream * f; //把*删去
public:
A(){ f = &cout; } //把&删去
A(ostream* t) :f(t){}
void print(){
*f << "msg"; //把*删去 }
};
void main(){
A a;
a.print();
}
这一段程序放在vs2013中能成功输出,但如果按照注释里的方法不用指针,就会编译错误:无法引用"="(f=cout中),它是已删除的函数。求教这是怎么回事? 展开
#include <fstream>
using namespace std;
class A{
private:
ostream * f; //把*删去
public:
A(){ f = &cout; } //把&删去
A(ostream* t) :f(t){}
void print(){
*f << "msg"; //把*删去 }
};
void main(){
A a;
a.print();
}
这一段程序放在vs2013中能成功输出,但如果按照注释里的方法不用指针,就会编译错误:无法引用"="(f=cout中),它是已删除的函数。求教这是怎么回事? 展开
1个回答
展开全部
原因是:流对象是不可以拷贝的。 你把* &删除之后,f = cout; 就是一个复制语句,是非法的。
在以前版本的VC++中,流类的复制操作和复制构造函数被声明为Private,所以外部代码是无法调用的,也就实现了防止复制的效果。
而你用的Visual Studio 2013扩展了delete语法(C++11)用于删除函数,这种扩展可以使得某个函数无法被调用。
下图是Visual studio 2015 ostream.h文件中截取的代码片段:
红色框包围的就是ostream类模版的复制构造函数。注意:ostream类实际上是basic_ostream类模板的一个实例。
通过观察可以发现:即使拷贝构造函数的访问控制修饰是public,但是由于后面添加了 = delete; 使得该函数无法被调用,所以你的代码就提示 "它是已删除的函数"。
ostream流类没有默认构造函数,所以删除* &之后你的代码还有一个错误。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询