我的项目有多个级别的继承。它就像这样
XMLs -> Entity -> Item
然后有许多项继承自Item,然后从Entity继承。现在,我将每个类定义为显示
class Entity: public XMLs
{
public:
Entity() {}
virtual ~Entity() {};
//other functions
};
这是给我带来麻烦的。每当我尝试在我的main函数中创建一个Item对象或任何类型的对象时,它会给我以下错误
/ usr / include / c ++ / 4.6 / ostream:在构造函数'Entity :: Entity()'中: /usr/include/c++/4.6/ostream:363:7:错误:'std :: basic_ostream< _CharT,_Traits> :: basic_ostream()[with _CharT = char,_Traits = std :: char_traits]'受保护
这是什么意思?我关于构造函数和受保护的所有内容涉及到我公开的关键字保护。
答案 0 :(得分:5)
再次阅读消息它没有说你的构造函数受到保护,它说std::basic_ostream
的构造函数受到保护。您的班级(或其家长)拥有std::basic_ostream
(或可能是std::ostream
)成员,该成员不能默认构建。您必须使用参数构造它。 This page表明它必须来自basic_streambuf<Elem, Tr>*
。
现在我要推断:你可能实际上并不想要你班级中的std::ostream
成员,你可能想要一个特定派生类型,或者你想要一个引用,或者(很可能)未知或可变的派生类型。但是,由于解决前两种情况的方法使得您的课程不可复制,因此最终解决方案实际上始终相同:如果您的班级拥有该流,则使用std::unique_ptr<std::ostream>
,如果您拥有该流,则使用std::ostream*
别人拥有它。
最后:错误的全文位于Visual Studio的“输出”窗口中,而不是“错误”窗口,它只显示摘要。该错误的全文将包含有关错误的更多详细信息,包括(最有可能)类的默认构造函数的名称和行号。