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

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

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

1. apple.h

#ifndef __APPLE_H__

#define __APPLE_H__

class Apple

{

public:

Apple();

int GetColor(void);

void SetColor(int color);

private:

int m_nColor;

};

#endif

apple.cpp

#include "apple.h"

Apple::Apple() : m_nColor(0)

{

}

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_

#ifdef __cplusplus

extern "C" {

#endif

struct tagApple; // Warning: 不能使用 extern 修饰

extern struct tagApple *GetInstance(void);

extern 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

#include

#include

#include

int main(void)

{

struct tagApple * pApple;

pApple = GetInstance();

SetColor(pApple, 1);

printf("color = %d\n", GetColor(pApple));

ReleaseInstance(&pApple);

assert(pApple == 0);

return 0;

}

可以用 GCC编译:

g++ -g -c apple.cpp AppleWrapper.cpp

gcc -g test.c -o test AppleWrapper.o apple.o -lstdc++

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

AppleWrapper.h

#ifndef _APPLE_WRAPPER_H__

#define _APPLE_WRAPPER_H_

#ifdef __cplusplus

extern "C" {

#endif

extern int GetInstance(int * handle);

extern void ReleaseInstance(int *handle);

extern void SetColor(int handle, int color);

extern int GetColor(int handle);

#ifdef __cplusplus

};

#endif

#endif

AppleWrapper.cpp

#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; // Error: Segmentation fault (core dumped)

*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

test.c

#include "AppleWrapper.h"

#include

#include

#include

#include

int main(void)

{

int handle = -1;

GetInstance(&handle);

SetColor(handle, 1);

printf("color = %d\n", GetColor(handle));

ReleaseInstance(&handle);

assert(handle == -1);

return 0;

}

转自 https://blog.csdn.net/caspiansea/article/details/9676153

🌸 相关推荐 🌸

拼多多店铺网络地址查看方法详解
365结束投注什么意思

拼多多店铺网络地址查看方法详解

📅 09-25 👀 6506
31家银行理财子公司股东背景一览
365结束投注什么意思

31家银行理财子公司股东背景一览

📅 08-07 👀 3047
Go框架比较:goframe、beego、iris和gin
bte365娱乐场

Go框架比较:goframe、beego、iris和gin

📅 07-14 👀 6181