我有一个包含大型数据表的类,它具有一个构造函数,该构造函数获取计算该数据所需的所有参数。但是,它需要很长时间才能运行,所以我添加了一个构造函数,它接收一个流,并从该流中读取数据。虽然我有一个设计这个类的RAII方法,但我遇到了麻烦,因为我有两个构造函数,并且在运行时我需要在它们之间进行选择。这是我想出的:RAII在两个构造函数之间进行选择
std::string filename; // Populated by command line arguments
DataTable table; // Empty constructor, no resource acquisition or initialization
if(filename.empty()) {
table = DataTable(/*various parameters*/);
} else {
std::ifstream filestream(filename);
table = DataTable(filestream); // Reads from file
}
这对我来说很脆弱。默认的构造函数将使对象保持有效状态,但是没用。它的唯一用处是在外部范围中创建一个“临时”对象,将其分配给if语句的其中一个分支。另外,在后台有一个“插入”标志来管理对象是默认构建还是完全初始化。有没有更好的方法来设计这个类?
这是正确的做法。如果他这样做,他可能会想要添加一个移动构造函数,当然,只有当他具有C++ 11时才会起作用。 (他将无法将临时ifstream绑定到std :: istream,他需要使用像std :: ifstream(filename).seekg(0,std :: ios_base: :beg)'。或者,如果构造函数具有C++ 11,那么它的构造函数也需要右值引用。) –