【程式設計技巧】-C隱藏結構體成員
阿新 • • 發佈:2021-11-01
目錄
前言
在看到這篇文章時覺得不錯,雖然現在還沒用上,但是至少知道有個這麼一個概念或者一個可行的方法。記錄下來。
瞭解過面向物件程式設計都應該知道 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;
}