【编程技巧】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;
} 

参考

原文地址:https://www.cnblogs.com/lizhuming/p/15486838.html