您的位置:首页 > 编程语言 > C语言/C++

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

2017-12-05 10:14 330 查看


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

apple.h

[cpp] view
plain copy

#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:

[cpp] view
plain copy

#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

[cpp] view
plain copy

#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

[cpp] view
plain copy

#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

[cpp] view
plain copy

#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编译:

[cpp] view
plain copy

g++ -c apple.cpp    

g++ -c apple.cpp  AppleWrapper.cpp    

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

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

[cpp] view
plain copy

#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  

[cpp] view
plain copy

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++