在构造函数中从std :: istream初始化const类数据成员

时间:2016-05-20 14:11:57

标签: c++ c++11 constructor const

我想在std :: istream:

的构造函数中初始化我的类const成员
class MyClass {
   private: const int dataMember;
   public: MyClass(std::istream& is) { /* read into datamember }
}

我想使用>> istream实例的运算符来填充我的dataMember,但我的dataMember是const。在C ++中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

当然,只需将其包装在一个函数中:

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

您可以通过从辅助函数中抛出来处理输入错误。

如果确实想要在没有帮助函数的情况下执行此操作,则可以使用istream_iterator强制执行

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

然而,这将导致一些古怪的错误处理。错误处理可以通过std::istream::exceptions完成,但调用者必须记住启用它们。否则,失败的读操作将调用UB。

我更喜欢帮助函数来解决错误问题。 (特别是因为我花了三次迭代才能做到正确而且我提倡UB。)

答案 1 :(得分:1)

您可以创建一个接收流并返回对象的函数。此函数从流中提取数据并将其放入构造函数中。

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