1. 程式人生 > 其它 >【程式設計技巧】-C隱藏結構體成員

【程式設計技巧】-C隱藏結構體成員

目錄

前言

在看到這篇文章時覺得不錯,雖然現在還沒用上,但是至少知道有個這麼一個概念或者一個可行的方法。記錄下來。

瞭解過面向物件程式設計都應該知道 publicprivate 。那我們也可以在 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;
} 

參考