我有以下结构:
struct Logger::LoggerImpl {
std::wofstream loggerStream;
}
Run Code Online (Sandbox Code Playgroud)
当我创建 LoggerImpl 时,显然将隐式创建 std::wofstream (通过编译器的默认构造函数)。
我的问题是,有没有办法在不使用指针的情况下阻止(或推迟)wofstream 的构造?因为我稍后将使用给定的文件名创建它。
我知道在这种情况下没有什么区别,但我是在理论基础上问的。
为什么不使用默认构造函数创建std::wofstream,然后只创建open()文件?绑定所包含对象的生命周期似乎是正确的方法。
在 C++11 中,您还可以将带有构造函数的对象放入union. 当然,结果是您需要接管会员的终身管理union。但是,通过这种方式,您可以将特定成员的构建推迟到以后。new请注意,下面代码中的 at 使用实际上只是放置 new,将对象构造到合适的位置。这是一个例子:
#include <iostream>
#include <fstream>
#include <new>
class foo
{
bool constructed;
union helper {
helper() {}
~helper() {}
std::ifstream stream;
} member;
public:
foo(): constructed() {}
~foo() {
if (constructed) {
using std::ifstream;
this->member.stream.~ifstream();
}
}
void open(std::string const& name) {
new (&this->member.stream) std::ifstream(name);
constructed = true;
}
std::streambuf* rdbuf() {
return this->member.stream.rdbuf();
}
};
int main()
{
foo f;
f.open("foo.cpp");
std::cout << f.rdbuf();
}
Run Code Online (Sandbox Code Playgroud)