使用 placement new 创建指向静态内存缓冲区的静态 const 指针
Use placement new to create a static const pointer to a static memory buffer
我想初始化一个指向 class 类型 MyClass2 对象的静态常量指针,它在实例化时存储在 class 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)];
};
有没有办法完成这样的事情?
当你的变量是静态的,你不能在构造函数中初始化它们。这根本没有意义!你想做的是
(在header)
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;
您可以将 static
成员变量的定义和初始化移动到 class 之外。
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();
我想初始化一个指向 class 类型 MyClass2 对象的静态常量指针,它在实例化时存储在 class 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)];
};
有没有办法完成这样的事情?
当你的变量是静态的,你不能在构造函数中初始化它们。这根本没有意义!你想做的是
(在header)
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;
您可以将 static
成员变量的定义和初始化移动到 class 之外。
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();