我想在std :: istream:
的构造函数中初始化我的类const成员class MyClass {
private: const int dataMember;
public: MyClass(std::istream& is) { /* read into datamember }
}
我想使用>> istream实例的运算符来填充我的dataMember,但我的dataMember是const。在C ++中有没有办法做到这一点?
答案 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);
}