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

标签 c++ sockets constructor default-constructor lazy-initialization

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

相关文章:

c++ - 具有扩展字符 (128-255) 的 Linux 中的 open() 函数返回 -1 错误

java - 定义构造函数类并初始化值

c++ - 我可以调用虚函数来初始化基类子对象吗?

scala - 从 Scala 调用 Java : protected constructor

c++ - 类(class)访问违规阅读位置

c++ - 如何更改 .pro 文件中 Qt Creator 的 OUT_PWD 设置

c++ - 在迭代器中取消引用类指针函数

c# - 来自 AsyncState 和 EndAccept() 函数的 .NET 套接字之间的区别

linux - Linux 中的 SO_WIFI_STATUS 套接字选项

安卓媒体播放器 "Connection reset by peer"