2009-12-18 180 views
0

我有派生類這樣的basic_iostream:類成員初始化父類

class MyStream : public std::basic_iostream<char>, 
       private boost::noncopyable 
{ 
public: 
    explicit MyStream(SomeUsefulData& data) : 
     buffer_(data), 
     std::basic_iostream<char>(&buffer_) 
    { 
    }; 

    ~MyStream() 
    { 
    }; 

private: 
    /// internal stream buffer 
    MyStreamBuffer<char> buffer_; 
}; // class MyStream 

當我創建它的實例,但是,我得到一個DataAbort例外。

SomeUsefulData data; 
MyStream stream(data); // <- Data Abort 

但如果我改變MyStream堆分配MyStreamBuffer,它工作正常:

class MyStream : public std::basic_iostream<char>, 
       private boost::noncopyable 
{ 
public: 
    explicit MyStream(SomeUsefulData& data) : 
     std::basic_iostream<char>(new MyStreamBuffer<char>(data)) 
    { 
    }; 

    ~MyStream() 
    { 
     delete rdbuf(); 
    }; 
}; // class MyStream 

這是錯誤的使用類成員初始化父類?

感謝, PaulH

回答

6

直接基類總是首先初始化,不管你把什麼樣的順序初始化語句。 如果你打開更多的編譯器警告,你應該得到一個關於此警告。

這意味着是的,用成員初始化一個基類是錯誤的,對不起!

2

是的,這是錯誤的。

初始化的順序是:

  1. 基類的對象(如果存在的話)
  2. 會員數據對象
  3. 構造函數代碼

因此,這:

explicit MyStream(SomeUsefulData& data) : 
    buffer_(data), 
    std::basic_iostream<char>(&buffer_) 

其實就是這個意思:

explicit MyStream(SomeUsefulData& data) : 
    std::basic_iostream<char>(&buffer_), 
    buffer_(data) 
0

其錯誤 Rememebr基類構造第一 ,然後派生類

這裏

explicit MyStream(SomeUsefulData& data) : 
     ... 
     std::basic_iostream<char>(&buffer_) 
    { 
    }; 

你嘗試用buffer_給init基類是不尚未構建