定义一个没有默认构造函数的类

时间:2019-09-11 09:14:29

标签: c++ class struct embedded tensorflow-lite

我遇到了一个问题,我必须在嵌入式系统中使用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运算符,并将其分配到正确的位置?但这似乎并不理想。

2 个答案:

答案 0 :(得分:3)

您可以使用new放置在给定位置创建对象:

new (&pData->myClass) MyClass(pData->otherClass);  

答案 1 :(得分:2)

使用合适的构造器:

struct MyAllocatedData
{
  MyAllocatedData() : otherClass(), myClass(otherClass) {}

  OtherClass otherClass;
  MyClass myClass;
};

然后

int main() {
  MyAllocatedData data;
  // ...
}

或者如果需要将其放置在内存中,请使用new放置:

MyAllocatedData* pData = new (dataIsSomewhere) MyAllocatedData{};
相关问题