我有一个包含大量数据表的类,它带有一个构造函数,该构造函数接受计算该数据所需的所有参数。但是,它需要很长时间才能运行,所以我添加了一个构造函数,它接受一个流,并从该流中读取数据。不过,我在想出一种设计此类的 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 语句的其中一个分支。此外,如果对象是默认构造的还是完全初始化的,在幕后还有一个标志“inited”来管理。有没有更好的方法来设计这个类?