使用new操作符从C实例化c++对象

Instantiate C++ object from C using operator new

本文关键字:实例化 c++ 对象 new 操作符 使用      更新时间:2023-10-16

我已经创建了一个c++程序和类,并计划将其编译为一个库。我找到了几个网站来解释如何创建和使用包装器来访问c++类方法。

我的环境是IAR EWARM,在我的情况下,我需要使用标准c来创建类实例化对象,我正在使用(或将需要使用)操作符"new",即类"scrnDev":

我一直在寻找有关如何使用C程序中的"new"操作符实例化对象的信息,但无法找到如何实现。

通常的方法是创建一些可以从c调用的c++函数,并返回内部分配的类的void*句柄:

extern "C" {
     void* createScrnDev() {
          return new scrnDev(); 
     } 
}

这个包装器API中的其他函数将接受句柄,并将其强制转换回原始对象实例:

extern "C" {
     void blink(void* scrnDev_) {
          static_cast<scrnDev*>(scrnDev_)->blink(); 
     } 
}

最后你需要一个destroy()函数来正确调用delete:

extern "C" {
     void destroyScrnDev(void* scrnDev_) {
          delete static_cast<scrnDev*>(scrnDev_); 
     } 
}

正如在注释中提到的,你也可以使用一个不透明的指针,它使用在两种语言中使用的struct声明:

scrnDev.h :

 struct scrnDevHandle;
 scrnDevHandle* createScrnDev();
 void blink(scrnDevHandle* scrnDev_);
 void destroyScrnDev(scrnDevHandle* scrnDev_);

scrnDev.cpp :

class scrnDev : public scrnDevHandle {
public:
    scrnDev() {}
    blink() {
        // ...
    }
};
extern "C" {
     scrnDevHandle * createScrnDev() {
          return new scrnDev(); 
     } 
     void blink(scrnDevHandle* scrnDev_) {
          static_cast<scrnDev*>(scrnDev_)->blink(); 
     } 
     void destroyScrnDev(scrnDevHandle* scrnDev_) {
          delete static_cast<scrnDev*>(scrnDev_); 
     } 
}

您可能有兴趣在这里阅读有关extern "C" {}接口的更多详细信息