【发布时间】:2019-08-01 20:50:05
【问题描述】:
让这成为示例代码:
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);
}
view函数只是类参数的视频打印函数,而save函数将类的参数保存在一个文件中。问题是,如果我声明std::ostream; 和ostream os; 为什么不能使用v[i]->view(os) 进行视频输出?如果我使用v[i]->view(os),它会说:
'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits<char>]' is protected
虽然这对于视频输出是正确的,但对于保存功能却不是这样,它可以正常工作,正如代码中所预期的那样。有人可以解释吗?对不起,如果我弄长了
【问题讨论】:
-
我们能不能看一下不起作用的代码,包括
view是如何定义的(请minimal reproducible example)? -
您显示的代码均未提及
std::ostream。错误消息来自其他代码。发布该代码。但是从描述中问题就很清楚了。std::ostream旨在用作输出流的基类。std::ostream os;不打算工作,编译器正确地抱怨。 -
std::ostream只是一个接口类,你需要一个子类(例如ofstream或ostringstream)来做一些有用的事情。您得到的错误是只有子类可以调用ostream构造函数的消息,提示“查找子类”。 -
顺便说一句
std::cout是ostream
标签: c++ polymorphism protected ostream