gpt4 book ai didi

c++ - 如何在 C++ 中进行惰性构造?

转载 作者:行者123 更新时间:2023-11-30 00:51:37 27 4
gpt4 key购买 nike

我想在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com