我想在 C++ 类中创建“惰性构造”,一个简单的方法是这样的:
#include "b.hpp" // class B
class A {
public:
// invoke B() in b.hpp, this constructor do not actually do init
A(int v_in) : v(v_in) {}
void foo() {
if(flag == false) {
b = create_B_obj();
flag = true;
}
}
private:
B create_B_obj() {
// some expensive ops
//...
}
private:
bool flag = false;
B b;
int v;
};
但存在的问题是 B 可能不包含默认构造函数 (B()
),那么在这种情况下我该如何进行“惰性构造”?
顺便说一句:我项目中的 B 类类似于套接字,需要进行连接或进行类似绑定(bind)的调用,所以我想将这些昂贵的操作延迟。
最佳答案
使用指针,最好是智能指针。
class A
{
public:
void foo() {
if( pb == nullptr ) {
pb.reset(create_B_obj());
}
}
private:
B* create_B_obj(); //or return std::unique_ptr
private:
std::unique_ptr<B> pb;
int v;
};
如果您改用 placement-new,则可以避免动态分配,在这种情况下,您需要使用 std::unique_ptr
的自定义删除器:
class A
{
public:
void foo() {
if( pb == nullptr ) {
pb.reset(create_B_obj());
}
}
private:
B* create_B_obj()
{
return new (buffer) B( /* arguments */);
}
private:
std::unique_ptr<B, PlacementNewDeleter> pb;
alignas(B) char buffer[sizeof(B)]; //buffer used by placement new
int v;
};
其中 PlacementNewDeleter
定义为:
struct PlacementNewDeleter
{
template<typename T>
void operator(T const *obj) const { obj->~T(); }
};
希望对您有所帮助。
关于c++ - 如何在 C++ 中进行惰性构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21087696/