簡體   English   中英

從構造函數中的std :: istream初始化const類數據成員

[英]Initialising const class data member from std::istream in constructor

我想從std :: istream初始化構造函數中的類const成員:

class MyClass {
   private: const int dataMember;
   public: MyClass(std::istream& is) { /* read into datamember }
}

我想使用istream實例的>>運算符來填寫我的dataMember,但我的dataMember是const。 C ++中有什么方法可以做到這一點嗎?

當然,只需將其包裝在一個函數中:

MyClass(std::istream& is) : dataMember{readInt(is)}{}

您可以通過拋出輔助函數來處理輸入錯誤。

如果您確實想在沒有幫助函數的情況下執行此操作,則可以使用istream_iterator強制執行此操作:

MyClass(std::istream& is) : dataMember{*std::istream_iterator<int>(is)}{}

但是,這將導致一些古怪的錯誤處理。 可以通過std::istream::exceptions完成錯誤處理,但是調用者必須記住啟用它們。 否則,讀取操作失敗將調用UB。

由於該錯誤處理原因,我更喜歡輔助函數。 (特別是我花了三遍迭代才把它弄對了,所以我一次提倡UB。)

您可以創建一個接受流並返回對象的函數。 此函數從流中提取數據並將其放入構造函數中。

static MyClass fromIStream(std::istream& is) {
    int datamember;
    is >> datamember;
    return MyClass(datamember);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM