推迟会员建设

Xen*_*ate 3 c++ constructor

我有以下结构:

struct Logger::LoggerImpl {
    std::wofstream loggerStream;
}
Run Code Online (Sandbox Code Playgroud)

当我创建 LoggerImpl 时,显然将隐式创建 std::wofstream (通过编译器的默认构造函数)。

我的问题是,有没有办法在不使用指针的情况下阻止(或推迟)wofstream 的构造?因为我稍后将使用给定的文件名创建它。

我知道在这种情况下没有什么区别,但我是在理论基础上问的。

Die*_*ühl 5

为什么不使用默认构造函数创建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)