Singleton ofstram:已创建但未写入的文件
Singleton ofstram: Files created but did not be written
我创建一个单例类来包装一些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
并将其存储在某个地方?
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- Singleton ofstram:已创建但未写入的文件