定义结构中没有默认构造函数的类
Defining a class with no default constructor inside a struct
我遇到了一个问题,我必须在嵌入式系统中使用C++库。该库(用于微控制器的Tensorflow Lite(专为嵌入式系统而设计,并且没有malloc/free,但是使用它的示例定义了堆栈上的所有内容,并且没有可用的默认构造函数。
在我的应用程序中定义堆栈不起作用,因为我需要能够在一个函数中初始化它,然后退出。我需要的是能够分配一个内存区域(使用我自己的分配器(,其中包含我需要的所有内容,然后初始化该内存区域中的所有内容。
我试图将其归结为一个最低限度的例子:
// This is a third party library
class OtherClass {};
class MyClass {
private:
OtherClass &c;
public:
MyClass(OtherClass &c) : c(c) {};
};
// My code
typedef struct {
OtherClass otherClass;
MyClass myClass;
} MyAllocatedData;
char dataIsSomewhere[sizeof(MyAllocatedData)];
MyAllocatedData *pData = (MyAllocatedData *)dataIsSomewhere;
int main() {
// dataIsSomewhere gets allocated somewhere on demand
// now we want to initialise everything
pData->myClass = MyClass(pData->otherClass);
return 0;
}
编译失败,并显示:
test.cpp: In function ‘int main()’:
test.cpp:20:45: error: use of deleted function ‘MyClass& MyClass::operator=(MyClass&&)’
pData->myClass = MyClass(pData->otherClass);
^
test.cpp:3:7: note: ‘MyClass& MyClass::operator=(MyClass&&)’ is implicitly deleted because the default definition would be ill-formed:
class MyClass {
^~~~~~~
test.cpp:3:7: error: non-static reference member ‘OtherClass& MyClass::c’, can’t use default assignment operator
有没有解决这个问题的好方法?修补库是一种可能性,但我宁愿不修补。
也许我可以定义自己的new
运算符,MyClass
将其分配到正确的位置?不过,这似乎并不理想。
您可以使用放置 new 在给定位置创建对象:
new (&pData->myClass) MyClass(pData->otherClass);
使用正确的构造器:
struct MyAllocatedData
{
MyAllocatedData() : otherClass(), myClass(otherClass) {}
OtherClass otherClass;
MyClass myClass;
};
然后
int main() {
MyAllocatedData data;
// ...
}
或者,如果需要将其放在内存中,请使用"放置新":
MyAllocatedData* pData = new (dataIsSomewhere) MyAllocatedData{};
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 构造函数默认公共和私有变量
- 类模板构造函数默认参数
- 构造函数默认参数
- C++模板构造函数默认参数
- 在c++中设置构造函数默认值
- c++构造函数默认参数
- C++构造函数默认值头文件