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

Initialising const class data member from std::istream in constructor

本文关键字:初始化 const 数据成员 istream std 构造函数      更新时间:2023-10-16

我想从 std::istream 初始化构造函数中的类 const 成员:

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

我想使用 istream 实例>>运算符来填写我的数据成员,但我的数据成员是常量。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);
}