2016-10-04 53 views
2

我想使用類成員初始值設定項的C++ 11功能來初始化類的變量。我有的類的變量是std :: string和std :: ifstream。類成員初始值設定項初始化ifstream錯誤檢查?

class A{ 
    std::string filename = "f1.txt"; 
    std::ifstream filestream = .... 
public: 
    .... 
}; 

是否有任何方法來初始化文件流,並同時使用類成員初始化檢查錯誤。

我想要做的是,類似下面:

class A{ 
    std::string filename = "f1.txt"; 
    std::ifstream filestream(filename); 
    if(filestream.is_open()) .... // check if file cannot be opened 
public: 
    .... 
}; 
+1

那麼,沒有。如果文件無法打開,你想怎麼做?你可以檢查在構造函數中,也許會拋出異常?但我認爲這是不好的做法。 – Rakete1111

+0

@ Rakete1111多數民衆贊成在我的想法以及..我只是想確保如果我做的是正確的..所以你建議我在構造函數內進行ifstream初始化? – solti

+0

是的,但我不知道我自己:/對不起。 – Rakete1111

回答

2

您可以編寫和撥打內嵌拉姆達表達式執行相應的檢查;這樣的λ-表達有權訪問數據成員:

class A { 
    std::string filename = "f1.txt"; 
    std::ifstream filestream = [&] { 
     std::ifstream fs{filename}; 
     if (!fs) 
      throw std::runtime_error("failed to open ifstream"); 
     return fs; 
    }(); 
}; 

這可能是更清晰的邏輯分離成服用filename作爲一個參數,例如可重複使用的輔助函數一個靜態成員函數:

class A { 
    std::string filename = "f1.txt"; 
    std::ifstream filestream = openChecked(filename); 
    static std::ifstream openChecked(std::string const& filename) 
    { 
     std::ifstream fs{filename}; 
     if (!fs) 
      throw std::runtime_error("failed to open ifstream"); 
     return fs; 
    } 
}; 
+0

我在你的回答後給出了進一步的想法,並且想接受你的回答。我看到你的答案後的想法是,如果用戶選擇使用不同的文件名?在這種情況下,我可能必須使用重寫類成員初始化文件名​​的mem-init構造函數。 – solti

+2

@solti是的,這肯定是覆蓋默認文件名的正確方法。 – ecatmur