C++ 无法使用ostream打印,但可以使用cout打印?
下面是示例代码:C++ 无法使用ostream打印,但可以使用cout打印?,c++,polymorphism,protected,ostream,C++,Polymorphism,Protected,Ostream,下面是示例代码: object o1(//parameters); object o2(//parameters); object o3(//parameters); object *v[3]; using std::cout; //video output ofstream of; //save on file //let's suppose v[0]=&o1; v[1]=&o2; v[2]=&o3; for (int i=0;i<3;i++) {
object o1(//parameters);
object o2(//parameters);
object o3(//parameters);
object *v[3];
using std::cout; //video output
ofstream of; //save on file
//let's suppose
v[0]=&o1;
v[1]=&o2;
v[2]=&o3;
for (int i=0;i<3;i++) {
v[i]->view(cout);
v[i]->save(of);
}
对象o1(//参数);
对象o2(//参数);
对象o3(//参数);
对象*v[3];
使用std::cout//视频输出
流的//存档
//让我们假设
v[0]=&o1;
v[1]=&o2;
v[2]=&o3;
for(int i=0;iview(cout);
v[i]>保存(of);
}
view函数只是类的参数的视频打印函数,而save函数将类的参数保存在文件中。问题是,如果我声明std::ostream;
和ostream os;
为什么我不能使用v[i]->view(os)
进行视频输出?如果我使用v[i]->view(os)
它会说:
“std::basic_ostream::basic_ostream()[带_CharT=char;_Traits=std::char_Traits]”受保护
虽然对于视频输出来说是这样,但对于保存功能来说却不是这样,它可以正常工作,正如代码中所预期的那样。有人能解释一下吗?如果我把它写得太长了,很抱歉问题:
1) 如果视图
功能定义为:
void view(std::ostream output, std::string text) // (1)
{
output << text;
}
然后编译器会给出一条错误消息:
在MSVC中:
错误C2280:'std::basic_ostream::basic_ostream(const std::basic_ostream&'):尝试引用已删除的函数
通用条款:
错误:使用删除的函数“std::basic\u ostream::basic\u ostream(const std::basic\u ostream&)[带_CharT=char;_Traits=std::char\u Traits]”
叮当声:
错误:调用“std::ostream”(又名“basic_ostream”)的已删除构造函数
2) 为了宣言
std::ostream os;
将显示以下错误消息:
MSVC:
错误C2512:'std::basic_ostream':没有合适的默认构造函数可用
通用条款:
错误:“std::basic_ostream::basic_ostream()[with _CharT=char;_Traits=std::char_Traits]”在此上下文中受保护
叮当声:
错误:调用类“std::basic\u ostream”的受保护构造函数
原因是: 这一切都是按照 默认构造函数没有定义-因此,如果没有特定的构造函数参数,则无法创建类型为
std::ostream
的变量
和C++引用有关:
复制构造函数受到保护,并被删除。输出流不可复制说明: 1) 因此,问题是在
(2)
中,参数std::cout
被传递给(1)
中定义的函数,以将std::ostream
复制到变量输出
但是该类的定义表示不能使用复制构造函数,因此编译器会给出错误消息
2) 在创建变量os
的情况下,它没有给出任何构造函数参数,没有默认构造函数,因此编译器会给出错误消息
如何解决这个问题? 1) 在函数声明中,更改定义,将
std::ostream
的引用(&
)作为参数:
void view(std::ostream& output, std::string text) // (1)
这允许它使用原始对象而不是复制(不允许复制)
2) 如果需要变量,则还应使用引用
std::ostream& out = std::cout;
我们是否可以看到不起作用的代码,包括如何定义
视图
(请)?您显示的代码中没有提到std::ostream
。错误消息来自其他代码。把密码贴出来。但从描述上看,问题相当清楚std::ostream
旨在用作输出流的基类<代码>标准::ostream操作系统不打算工作,编译器正确地抱怨。std::ostream
只是一个接口类,您需要一个子类(例如流的或ostringstream
)来做一些有用的事情。您得到的错误是,只有子类才能调用ostream
构造函数,提示“查找子类”。顺便说一句,std::cout
的可能重复项是ostream
std::ostream& out = std::cout;