使用placement new创建一个指向静态内存缓冲区的静态const指针

时间:2016-06-22 17:24:44

标签: c++ c++11 const placement-new

我想初始化一个指向类类型MyClass2的对象的静态常量指针,它在实例化时存储在类MyClass1中的静态数据缓冲区中。

这不起作用:

class MyClass1 {
   public:
       MyClass1()
       {
           _my_class_2_ptr = new (_my_class_2_buf) MyClass2();
       }

   private:
      static MyClass2 *const  _my_class_2_ptr;
      static char *_my_class_2_buf = new char[sizeof(MyClass2)]; 
};

有没有办法完成这样的事情?

2 个答案:

答案 0 :(得分:4)

当变量是静态的时,您无法在构造函数中初始化它们。它没有意义!你想做的是像

(标题中)

class MyClass1 {
   // member    
   public:
      static MyClass2 *const  _my_class_2_ptr;
      static std::aligned_storage_t<sizeof(MyClass2)> _my_class_2_buf; 
};

(在cpp中)

std::aligned_storage_t<sizeof(MyClass2)> MyClass1::_my_class_2_buf;
MyClass2* const MyClass1::_my_class_2_ptr = new (&MyClass1::_my_class_2_buf) MyClass2;

答案 1 :(得分:2)

您可以将static成员变量的定义和初始化移到类外。

class MyClass1 {
   public:
       MyClass1() {}

   private:
      static MyClass2 *const  _my_class_2_ptr;
      static char *_my_class_2_buf; 
};

char *MyClass2::_my_class_2_buf = new char[sizeof(MyClass2)]; 
MyClass2 *const  MyClass1::_my_class_2_ptr = new (_my_class_2_buf) MyClass2();