Singleton ofstram:已创建但未写入的文件

Singleton ofstram: Files created but did not be written

本文关键字:文件 ofstram 创建 Singleton      更新时间:2023-10-16

我创建一个单例类来包装一些ofstream

struct OutputFiles {
public: 
std::ofstream minus_total, plus_total, HoughMappingMinus_cc, HoughMappingPlus_cc;
template <typename T>
static void init(OutputFilesName<T>& files_name) {
instance_impl(files_name);
}
static OutputFiles& instance() {
return instance_impl();
}
template <typename T>
OutputFiles(OutputFilesName<T>& files_name) :
minus_total(files_name.resut_subdir_name + "/" + files_name.result_file_name_data_M),
plus_total(files_name.resut_subdir_name + "/" + files_name.result_file_name_data_P),
HoughMappingMinus_cc(files_name.resut_subdir_name + "/" + files_name.result_file_name_M_CC),
HoughMappingPlus_cc(files_name.resut_subdir_name + "/" + files_name.result_file_name_P_CC)
{ }
OutputFiles() = default;
OutputFiles(const OutputFiles&) = delete;
OutputFiles& operator=(const OutputFiles&) = delete;
private:
template <typename... Args>
static OutputFiles& instance_impl(Args&&... args) {
static OutputFiles singleton( std::forward<Args&&>(args)... );
return singleton;
}
};

此类必须使用OutputFilesName<T>类初始化

template <typename T>
struct OutputFilesName {
OutputFilesName(
const T&& i_resut_subdir_name,
const T&& i_result_file_name_M_CC,
const T&& i_result_file_name_P_CC,
const T&& i_result_file_name_data_M,
const T&& i_result_file_name_data_P
) : 
resut_subdir_name(i_result_file_name_M_CC),
result_file_name_M_CC(i_result_file_name_M_CC),
result_file_name_P_CC(i_result_file_name_P_CC),
result_file_name_data_M(i_result_file_name_data_M),
result_file_name_data_P(i_result_file_name_data_P)
{ }
const T resut_subdir_name;
const T result_file_name_M_CC;
const T result_file_name_P_CC;
const T result_file_name_data_M;
const T result_file_name_data_P;
};

我编写主代码调用它:

int main(){
OutputFilesName<std::string> fn{"fa_name","fb_name","aa","bb","cc"};
fs::create_directory(fn.resut_subdir_name);
OutputFiles::init(fn);
OutputFiles::instance().minus_total << "1" << std::endl;
OutputFiles::instance().plus_total << "2" << std::endl;
OutputFiles::instance().HoughMappingMinus_cc << "3"<< std::endl;
OutputFiles::instance().HoughMappingPlus_cc << "4"<< std::endl;
bool open1 = OutputFiles::instance().minus_total.is_open();
bool open2 = OutputFiles::instance().plus_total.is_open();
bool open3 = OutputFiles::instance().HoughMappingMinus_cc.is_open();
bool open4 = OutputFiles::instance().HoughMappingPlus_cc.is_open();
std::cout << open1 << open2 << open3 << open4 << std::endl;
}

结果和完整的代码在这里,

ofstream似乎无法打开。

文件和目录已创建,

但内容是空的。

我很困惑。

这是一种管理对象的奇怪方法。

您的OutputFiles::init(fn)调用函数模板专用化instance_impl(fn)。这个特化有一个static的局部变量叫做singleton,用ctor argsfn实例化,你返回一个引用。都很好。

然后,您OutputFiles::instance()获得OutputFiles&。问题是,该函数调用instance_impl(),一个不同的函数模板专用化。这种特化还有一个static局部变量,称为singleton,默认构造。因此,它的所有ofstream成员也是默认构建的,流式传输给他们没有任何作用。

关键是instance_impl的两个专业是不同的功能。因此,这不是绕过静态初始化的有效方法。

为什么不以正常方式实例化OutputFiles并将其存储在某个地方?