【问题标题】:C++ Class Constructor defined public, says it's protectedC++ 类构造函数定义为公共的,表示它是受保护的
【发布时间】:2013-01-27 03:44:30
【问题描述】:

我有一个具有多级继承的项目。是这样的

XMLs -> Entity -> Item 然后有许多从 Item 继承的项目类,然后从 Entity 继承。现在,我已经定义了每个类,如图所示

    class Entity: public XMLs
    {
     public: 
            Entity() {}
            virtual ~Entity() {};
         //other functions
    };

这是给我带来麻烦的一个。每当我尝试在我的主函数中创建一个 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]' 受保护

这是什么意思?我在谷歌上搜索的关于构造函数和受保护的所有内容都涉及我公开的关键字 protected。

【问题讨论】:

  • 您没有发布您的实际代码。努力缩小问题范围,然后发布一个具有代表性的、最小的示例。
  • 答案在您未共享的错误消息中。在您自己的源文件中提及特定行的错误消息。
  • @DrewDormann 同意 - 如此接近以至于过于本地化
  • 有人的回答为我修复了它,但它说他们的帖子已被删除。我只需要使用 std::ostream* 而不是 std::ostream。
  • @user1357707:这是 Robᵩ 的回答,但我相信他删除了它,因为我的回答更彻底,但得出了相同的结论。

标签: c++ inheritance constructor public protected


【解决方案1】:

再次阅读消息它并没有说你的构造函数受到保护,它说std::basic_ostream的构造函数受到保护。您的班级(或其父班级)有一个 std::basic_ostream(或者可能是 std::ostream)成员,该成员不能默认构造。您必须使用参数构造它。 This page 表明它必须从 basic_streambuf&lt;Elem, Tr&gt;* 构造。

现在我要推断一下:您可能实际上并不想要类中的 std::ostream 成员,您可能想要一个特定的派生类型,或者您想要一个引用,或者(很可能)一个未知数或可变派生类型。但是由于解决前两种情况的 nieve 方法使您的类不可复制,因此最终的解决方案几乎总是相同的:如果您的类拥有流,则使用 std::unique_ptr&lt;std::ostream&gt;,如果其他人拥有它,则使用 std::ostream* .

最后:错误的全文在 Visual Studio 的“输出”窗口中,而不是在“错误”窗口中,它只显示摘要。该错误的全文将包含有关该错误的更多详细信息,包括(很可能)您的类的默认构造函数的名称和行号。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 2013-08-29
    • 2019-08-24
    • 2014-12-23
    • 2011-05-30
    • 1970-01-01
    • 2014-07-25
    • 2011-05-27
    • 2012-06-04
    相关资源
    最近更新 更多