如何用C语言封装 C++的类,在 C里面使用

转载 2015年07月08日 11:24:10

本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在  wrapper的实现文件里实现。

1. apple.h

  1.    
  2. #ifndef __APPLE_H__  
  3. #define __APPLE_H__  
  4. class Apple  
  5. {  
  6. public:  
  7.     enum  
  8.     {  
  9.         APPLE_COLOR_RED,  
  10.         APPLE_COLOR_BLUE,  
  11.         APPLE_COLOR_GREEN,  
  12.     };  
  13.   
  14.     Apple();  
  15.     int GetColor(void);  
  16.     void SetColor(int color);  
  17. private:  
  18.     int m_nColor;  
  19. };  
  20. #endif   
apple.cpp:

  1. #include "apple.h"  
  2. Apple::Apple():m_nColor(APPLE_COLOR_RED)  
  3. {  
  4. }  
  5.   
  6. void Apple::SetColor(int color)  
  7. {  
  8.     m_nColor = color;  
  9. }  
  10.   
  11. int Apple::GetColor(void)  
  12. {  
  13.     return m_nColor;  
  14. }  

2. AppleWrapper.h

  1. #ifndef _APPLE_WRAPPER_H__  
  2. #define _APPLE_WRAPPER_H_  
  3. struct tagApple;  
  4. #ifdef __cplusplus  
  5. extern "C" {  
  6. #endif  
  7. struct tagApple *GetInstance(void);  
  8. void ReleaseInstance(struct tagApple **ppInstance);  
  9. extern void SetColor(struct tagApple *pApple, int color);  
  10. extern int GetColor(struct tagApple *pApple);  
  11. #ifdef __cplusplus  
  12. };  
  13. #endif  
  14. #endif  

AppleWrapper.cpp

  1. #include "AppleWrapper.h"  
  2. #include "apple.h"  
  3.   
  4. #ifdef __cplusplus  
  5. extern "C" {  
  6. #endif  
  7. struct tagApple  
  8. {  
  9.     Apple apple;  
  10. };  
  11. struct tagApple *GetInstance(void)  
  12. {  
  13.     return new struct tagApple;  
  14. }  
  15. void ReleaseInstance(struct tagApple **ppInstance)  
  16. {  
  17.     delete *ppInstance;  
  18.     *ppInstance = 0;  
  19.       
  20. }  
  21. void SetColor(struct tagApple *pApple, int color)  
  22. {  
  23.     pApple->apple.SetColor(color);  
  24. }  
  25.   
  26. int GetColor(struct tagApple *pApple)  
  27. {  
  28.     return pApple->apple.GetColor();  
  29. }  
  30. #ifdef __cplusplus  
  31. };  
  32. #endif  

3. test.c

  1. #include "AppleWrapper.h"  
  2. #include <assert.h>  
  3.   
  4. int main(void)  
  5. {  
  6.     struct tagApple * pApple;  
  7.     pApple= GetInstance();  
  8.     SetColor(pApple, 1);  
  9.     int color = GetColor(pApple);  
  10.     printf("color = %d\n", color);  
  11.     ReleaseInstance(&pApple);  
  12.     assert(pApple == 0);  
  13.     return 0;  
  14. }  

可以用 GCC编译:

  1. g++ -c apple.cpp  
  2. g++ -c apple.cpp  AppleWrapper.cpp  
  3. gcc test.c -o test AppleWrapper.o apple.o -lstdc++  

其实,  wrapper里的 struct 完全可以不要,定义一个  handle更好:

  1. #ifndef _APPLE_WRAPPER_H__  
  2. #define _APPLE_WRAPPER_H_  
  3. #ifdef __cplusplus  
  4. extern "C" {  
  5. #endif  
  6. int  GetInstance(int *handle);  
  7. void ReleaseInstance(int *handle);  
  8. extern void SetColor(int handle, int color);  
  9. extern int GetColor(int handle);  
  10. #ifdef __cplusplus  
  11. };  
  12. #endif  
  13. #endif  

  1. #include "AppleWrapper.h"  
  2. #include "apple.h"  
  3. #include <vector>  
  4.   
  5. #ifdef __cplusplus  
  6. extern "C" {  
  7. #endif  
  8.   
  9. static std::vector<Apple *> g_appleVector;  
  10.   
  11. int GetInstance(int * handle)  
  12. {  
  13.     g_appleVector[0] =  new Apple;  
  14.     *handle = 0;  
  15.     return 1;  
  16. }  
  17. void ReleaseInstance(int *handle)  
  18. {  
  19.     delete g_appleVector[*handle];  
  20.     *handle = -1;  
  21.       
  22. }  
  23. void SetColor(int handle, int color)  
  24. {  
  25.     g_appleVector[handle]->SetColor(color);  
  26. }  
  27.   
  28. int GetColor(int handle)  
  29. {  
  30.     return g_appleVector[handle]->GetColor();  
  31. }  
  32. #ifdef __cplusplus  
  33. };  
  34. #endif  

如何用C语言封装 C++的类,在 C里面使用

本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在  wrapper的实现文件里实现。 1. apple.h #ifn...
  • CaspianSea
  • CaspianSea
  • 2013年08月01日 01:02
  • 10252

纯C语言实现简单封装继承机制

0 继承是OO设计的基础继承是OO设计中的基本部分,也是实现多态的基础,C++,C#,Objective-C,Java,PHP,JavaScript等为OO而设计的语言,其语言本身对实现继承提供了直接...
  • smstong
  • smstong
  • 2016年02月21日 12:09
  • 6406

如何用C语言封装 C++的类,在 C里面使用 .

本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在  wrapper的实现文件里实现。 1. apple.h ...
  • u014338577
  • u014338577
  • 2016年11月23日 22:02
  • 183

如何用C语言封装 C++的类,在 C里面使用

本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在  wrapper的实现文件里实现。 1. apple.h ...
  • qiumingjian
  • qiumingjian
  • 2017年06月02日 10:41
  • 757

c++之封装——string类型的实现

以前在C语言中并没有string这个内置类型,但是到了c++里面就可以使用了,c++中可以定义string变量,对string类型的变量可以进行各种操作,包括相加、相减、赋值等等,就和int ,dou...
  • Korey_sparks
  • Korey_sparks
  • 2016年08月04日 01:00
  • 746

C语言实现封装,继承

1.C语言实现封装在C语言当中,是不存在封装这一个特性的,我们要实现它,我们可以借助两个方法:1.利用C语言中的头文件,在头文件中进行声明,在C文件中对它进行定义,这样就可以隐藏内部信息,用户只能看到...
  • qq_26768741
  • qq_26768741
  • 2016年09月17日 14:34
  • 681

工作中重新封装编写的一系列工具函数(c/c++)

// //  JGUtil.cpp // #include "JGUtil.h" #include "cocos2d.h" #include "u...
  • zhangyulin54321
  • zhangyulin54321
  • 2016年05月26日 16:36
  • 890

C语言调用C++库接口的方法概述

最近需要在由纯c语言编写的代码中调用C++的动态库,在网上找了一些资料,现在总结下解决方法。 主要的思想就是将C++的动态库再封装一层,在这一层编写C语言的函数api,这API中使用C++动态库提...
  • vevenlcf
  • vevenlcf
  • 2015年05月26日 11:25
  • 2735

C语言 C++相互调用问题

1. C++调用C语言函数 C语言头文件  c_header.h #ifndef __C_HEADER_H_ #define __C_HEADER_H_ #ifdef __cplusplus ext...
  • jisuanji_wjfioj
  • jisuanji_wjfioj
  • 2015年07月29日 17:23
  • 468

C++实现R语言向量化运算(向量类:c 矩阵类:matrix)2015.9.11

类源代码: #include using std::cout; using std::endl; using std::cin; using std::istream; using std::ios_...
  • sinat_30665603
  • sinat_30665603
  • 2016年07月16日 21:49
  • 903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用C语言封装 C++的类,在 C里面使用
举报原因:
原因补充:

(最多只允许输入30个字)