C ++类构造函数定义了public,表示它受到保护

时间:2013-02-11 22:44:11

标签: c++ inheritance constructor public protected

我的项目有多个级别的继承。它就像这样

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]'受保护

这是什么意思?我关于构造函数和受保护的所有内容涉及到我公开的关键字保护。

1 个答案:

答案 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的“输出”窗口中,而不是“错误”窗口,它只显示摘要。该错误的全文将包含有关错误的更多详细信息,包括(最有可能)类的默认构造函数的名称和行号。