前言
在看到这篇文章时觉得不错,虽然现在还没用上,但是至少知道有个这么一个概念或者一个可行的方法。记录下来。
了解过面向对象编程都应该知道 public
和 private
。那我们也可以在 c 上实现,且在结构体上实现成员的公私有。
李柱明博客:https://www.cnblogs.com/lizhuming/p/15486838.html
原理
原理:
- 一个结构体 A (放在源文件)内包含两个子结构体成员,一个为
public
类型一个为private
。 - 一个结构体 B(放在头文件)内只包含公开使用的子结构体
public
。 - 结构体 A 和结构体 B 命名是一样的。
public
类型结构体放在头文件,公开使用。private
类型放在源文件,私有使用。
源码(bug 菌)
- app.h
/************filename: App.h*************/
#ifndef __APP_H__
#define __APP_H__
typedef struct _tag_Stpublic stpublicObj;
struct _tag_Stpublic
{
int member1;
int member2;
};
typedef struct _tag_StObj stObj;
struct _tag_StObj
{
stpublicObj public;
};
//interface
extern stObj * sCreate(int member1,int member2);
extern int sAddprivate(stObj *pObj);
extern int sAddpublic(stObj *pObj);
#endif
- app.c
/************filename: App.c*************/
//#include "App.h"
typedef struct _tag_Stpublic stpublicObj;
struct _tag_Stpublic
{
int member1;
int member2;
};
typedef struct _tag_Stprivate stprivateObj;
struct _tag_Stprivate
{
int member1;
int member2;
};
typedef struct _tag_StObj stObj;
struct _tag_StObj
{
stpublicObj public;
stprivateObj private;
};
/**********************************
* Function : sCreate
* Note :创建对象
* Author: bug菌
**********************************/
stObj * sCreate(int member1,int member2)
{
static stObj staticObj;
staticObj.private.member1 = member1;
staticObj.private.member2 = member2;
return &staticObj;
}
/**********************************
* Function : sAdd
* Note :对象方法
* Author: bug菌
**********************************/
int sAddprivate(stObj *pObj)
{
return (pObj->private.member1 + pObj->private.member2);
}
/**********************************
* Function : sAdd
* Note :对象方法
* Author: bug菌
**********************************/
int sAddpublic(stObj *pObj)
{
return (pObj->public.member1 + pObj->public.member2);
}
- 测试 demo
/**************main.c file****************/
#include <stdio.h>
#include "App.h"
int main(void)
{
stObj *Obj;
Obj = sCreate(3,5); //内部构造结构体
Obj->public.member1 = 10;
Obj->public.member1 = 6;
Obj->public.member2 = 10;
printf("member1 = %d\n",Obj->public.member1); //调用OK,member1被公开
printf("member2 = %d\n",Obj->public.member2); //调用OK,member1被公开
// printf("member1 = %d\n",Obj->private.member1); //调用失败,因为member1被隐藏
// printf("member2 = %d\n",Obj->private.member2); //调用失败,因为member2被隐藏
printf("private result = %d\n",sAddprivate(Obj)); //调用相应的接口
printf("public result = %d\n",sAddpublic(Obj)); //调用相应的接口
return 0;
}