如何用C语言封装 C++的类,在 C里面使用
来源:互联网 发布:乌镇互联网大会 知乎 编辑:程序博客网 时间:2024/05/19 05:34
本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在 wrapper的实现文件里实现。
apple.h
#ifndef __APPLE_H__ #define __APPLE_H__ class Apple { public: enum { APPLE_COLOR_RED, APPLE_COLOR_BLUE, APPLE_COLOR_GREEN, }; Apple(); int GetColor(void); void SetColor(int color); private: int m_nColor; }; #endif
apple.cpp:
#include "apple.h" Apple::Apple():m_nColor(APPLE_COLOR_RED) { } void Apple::SetColor(int color) { m_nColor = color; } int Apple::GetColor(void) { return m_nColor; }
AppleWrapper.h
#ifndef _APPLE_WRAPPER_H__ #define _APPLE_WRAPPER_H_ struct tagApple; #ifdef __cplusplus extern "C" { #endif struct tagApple *GetInstance(void); void ReleaseInstance(struct tagApple **ppInstance); extern void SetColor(struct tagApple *pApple, int color); extern int GetColor(struct tagApple *pApple); #ifdef __cplusplus }; #endif #endif
AppleWrapper.cpp
#include "AppleWrapper.h" #include "apple.h" #ifdef __cplusplus extern "C" { #endif struct tagApple { Apple apple; }; struct tagApple *GetInstance(void) { return new struct tagApple; } void ReleaseInstance(struct tagApple **ppInstance) { delete *ppInstance; *ppInstance = 0; } void SetColor(struct tagApple *pApple, int color) { pApple->apple.SetColor(color); } int GetColor(struct tagApple *pApple) { return pApple->apple.GetColor(); } #ifdef __cplusplus }; #endif
test.c
#include "AppleWrapper.h" #include <assert.h> int main(void) { struct tagApple * pApple; pApple= GetInstance(); SetColor(pApple, 1); int color = GetColor(pApple); printf("color = %d\n", color); ReleaseInstance(&pApple); assert(pApple == 0); return 0; }
可以用 GCC编译:
g++ -c apple.cpp g++ -c apple.cpp AppleWrapper.cpp gcc test.c -o test AppleWrapper.o apple.o -lstdc++
其实, wrapper里的 struct 完全可以不要,定义一个 handle更好:
#ifndef _APPLE_WRAPPER_H__ #define _APPLE_WRAPPER_H_ #ifdef __cplusplus extern "C" { #endif int GetInstance(int *handle); void ReleaseInstance(int *handle); extern void SetColor(int handle, int color); extern int GetColor(int handle); #ifdef __cplusplus }; #endif #endif
#include "AppleWrapper.h" #include "apple.h" #include <vector> #ifdef __cplusplus extern "C" { #endif static std::vector<Apple *> g_appleVector; int GetInstance(int * handle) { g_appleVector[0] = new Apple; *handle = 0; return 1; } void ReleaseInstance(int *handle) { delete g_appleVector[*handle]; *handle = -1; } void SetColor(int handle, int color) { g_appleVector[handle]->SetColor(color); } int GetColor(int handle) { return g_appleVector[handle]->GetColor(); } #ifdef __cplusplus }; #endif
转载地址:
http://blog.csdn.net/caspiansea/article/details/9676153
阅读全文
0 0
- 如何用C语言封装 C++的类,在 C里面使用
- 如何用C语言封装 C++的类,在 C里面使用
- 如何用C语言封装 C++的类,在 C里面使用
- 如何用C语言封装 C++的类,在 C里面使用
- 如何用C语言封装 C++的类,在 C里面使用 .
- 如何用C语言封装 C++的类,在 C里面使用
- 如何用C语言封装 C++的类,在 C里面使用
- 如何用C语言封装 C++的类
- C语言如何用OpenGL
- C语言如何用OpenGL
- 如何用C语言调用JAVA的类文件啊
- 如何用C语言调用JAVA的类
- 如何用C语言实现C++的基本特性:封装、继承、多态
- 最近在研究如何用C语言实现AI
- 如何用VS2008编写C语言
- 如何用c语言实现多态
- 【socket】如何用c语言访问网站
- 如何用C语言实现面向对象
- 斐波那契数列
- 解决sublime下再次运行node,端口被占用无法再次运行问题
- 欢迎使用CSDN-markdown编辑器
- 将SQLServer表直接导入Oracle数据库(图文教程)
- Windows下利用osm2pgsql将OSM数据导入到Postgres中的方法
- 如何用C语言封装 C++的类,在 C里面使用
- svn查看某个时间段的日志信息
- 找不到localhost的网页错误怎么办?
- Spring MVC 笔记
- 发送有序广播
- Learning Complexity-Aware Cascades for Deep Pedestrian Detection
- 模糊C均值分类(FMC))
- [乐意黎原创] PHP7抛Warning: PDO::__construct(): MySQL server has gone away in ...的解决方案
- s14 python3 day1 作业3 三级菜单