如何用C语言封装 C++的类,在 C里面使用
本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在??wrapper的实现文件里实现。 1. 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; } 2. 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 3. test.c #include "AppleWrapper.h" #include int main(void) { ?? ?struct tagApple * pApple; ?? ?pApple= GetInstance(); ?? ?SetColor(pApple,1); ?? ?int color = GetColor(pApple); ?? ?printf("color = %dn",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 #ifdef __cplusplus extern "C" { #endif static std::vector 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 ---------------------? 作者:caspiansea? 来源:CSDN? 原文:https://blog.csdn.net/caspiansea/article/details/9676153? 版权声明:本文为博主原创文章,转载请附上博文链接! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |