加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:48:54 所属栏目:百科 来源:网络整理
导读:本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在??wrapper的实现文件里实现。 1. apple.h #ifndef __APPLE_H__ #define __APPLE_H__ class Apple { public: ?? ?enum ?? ?{ ?? ??? ?APPLE

本文给出了一种方法。基本思想是,写一个 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?


版权声明:本文为博主原创文章,转载请附上博文链接!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读