使用operator new

时间:2016-06-29 17:46:43

标签: c++ c instantiation

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

我的环境是IAR EWARM,在我的情况下我需要使用标准C.要创建类实例化对象,我正在使用(或将需要使用)运算符“new”,即对于类“scrnDev”:bLink1 = new(scrnDev);

我一直在搜索有关如何使用C程序中的“new”运算符实例化对象的信息,但无法找到如何实现这一点。

1 个答案:

答案 0 :(得分:7)

通常的方法是创建一些可以从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_); 
     } 
}

如评论中所述,您还可以使用opaque pointer,它使用两种语言中使用的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" {}接口here

的更多详情
相关问题