2014-02-28 143 views
2

我必須在liblas閱讀器類中編寫一個包裝器。我想在構造函數中創建reader實例並將其保存在成員變量中。初始化沒有初始化列表的成員變量和沒有默認構造函數的類型?

class LASPointReader : PointReader{ 
private: 
    liblas::Reader reader; 

    ... 
} 

這就是我想會的工作:

LASPointReader::LASPointReader(string file){ 
    ifstream ifs; 
    ifs.open(file, std::ios::in | std::ios::binary); 
    liblas::ReaderFactory f; 
    reader = f.CreateWithStream(ifs); 
    ... 
} 

但這種失敗,因爲liblas ::讀者不具有默認構造函數。然後我試圖讓讀者變量的指針,並做

reader = &f.CreateWithStream(ifs); 

,因爲現在我得到「R6025 - 純虛函數調用」哪些失敗的錯誤在運行時,當我使用閱讀器。

然後我嘗試了比較難看的初始化列表:

LASPointReader::LASPointReader(string file) 
    : reader(liblas::ReaderFactory().CreateWithStream(ifstream(file, std::ios::in | std::ios::binary))) 
{ 

但現在,請讀者僅適用部分。它確實可以加載文件的頭部,但另一種應該讀取內容的方法失敗。

我該如何將這個閱讀器實例存儲在我的課堂上?

回答

6

C++流不可複製。這意味着CreateWithStream()別無選擇,只能通過參考採用該流並存儲該參考。這又意味着只要它所指的流是有效的,它就會是有效的。在你的初始化列表的情況下,這只是直到初始化結束。 (我想你使用的是Visual Studio,否則編譯器會抱怨說它不能將右值綁定到非const引用)。

如果出現這種情況,只要讀者有問題,就必須確保該流是有效的。這意味着使流成爲數據成員。在C++中,成員始終按照類中的聲明順序進行初始化,因此請按照以下方式進行初始化:

class LASPointReader : PointReader{ 
private: 
    std::ifstream stream; 
    liblas::Reader reader; 

    ... 
} 


LASPointReader::LASPointReader(string file) 
    : stream(file, std::ios::in | std::ios::binary) 
    , reader(liblas::ReaderFactory().CreateWithStream(stream)) 
{ 
+0

工作方式類似於魅力。 感謝您的解釋,現在它是有道理的。 – Markus

相關問題