2013-02-11 61 views
-1

我有一個具有多級繼承的項目。它是這樣的C++類構造函數定義public,表示它是受保護的

XMLs -> Entity -> Item然後有很多項目類繼承從物品,然後從實體繼承。現在,我已將每個班級定義爲如圖所示

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

這是一個給我帶來麻煩的人。每當我嘗試在我的主要功能在所有真正創建一個項目對象或任何類型的對象,它給了我下面的錯誤

/usr/include/c++/4.6/ostream: In constructor ‘Entity::Entity()’: /usr/include/c++/4.6/ostream:363:7: error: ‘std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits]’ is protected

這是什麼意思?我關於構造函數和保護的所有內容都涉及到關鍵字protected我公開的地方。

+5

你沒有發佈你的實際代碼。付出一些努力來縮小問題的範圍,然後發表一個有代表性的最小例子。 – 2013-02-11 22:46:00

+4

答案出現在您未分享的錯誤消息中。在自己的源文件中提到特定行的錯誤消息。 – 2013-02-11 22:47:16

+1

@DrewDormann同意 - 太接近本地化 – djechlin 2013-02-11 22:50:33

回答

5

再次閱讀消息它並沒有說你的構造函數是受保護的,它說std::basic_ostream的構造函數是受保護的。你的班級(或其父母)有一個std::basic_ostream(或者std::ostream)成員,該成員不能被默認構建。你必須用一個參數來構造它。 This page表明它必須由basic_streambuf<Elem, Tr>*構成。

現在我要推斷:您可能實際上並不想在您的課程中使用std::ostream成員,您可能需要特定派生類型,或者您想要參考,或者(很可能)是未知的或可變衍生類型。但是,由於處理前兩種情況的方法不太合適,最終的解決方案實際上總是相同的:如果您的班級擁有該流,則使用std::unique_ptr<std::ostream>,如果其他人擁有該流,則使用std::unique_ptr<std::ostream>

最後:錯誤的完整文本位於Visual Studio的「輸出」窗口中,而不是顯示摘要的「錯誤」窗口中。該錯誤的完整文本將包含有關該錯誤的更多詳細信息,包括(很可能)您的類的默認構造函數的名稱和行號。

相關問題