使用new操作符从C实例化c++对象
Instantiate C++ object from C using operator new
我已经创建了一个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" {}
接口的更多详细信息
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- [temp.variadic]中关于包扩展实例化的措辞