在看到这篇文章时觉得不错,虽然现在还没用上,但是至少知道有个这么一个概念或者一个可行的方法。记录下来。
了解过面向对象编程都应该知道 public
和 private
。那我们也可以在 c 上实现,且在结构体上实现成员的公私有。
李柱明博客:https://www.cnblogs.com/lizhuming/p/15486838.html
原理:
public
类型一个为 private
。public
。public
类型结构体放在头文件,公开使用。private
类型放在源文件,私有使用。/************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
/************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); }
/**************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; }