zoukankan      html  css  js  c++  java
  • 【编程技巧】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;
    } 
    

    参考

  • 相关阅读:
    linux利用grep查看打印匹配的下几行或前后几行的命令
    Linux NetHogs监控工具介绍
    db2 查看进程 db2中的常用命令及使用方法
    Linux python <tab>自动补全
    Saltstack pillar组件
    History(历史)命令用法
    Saltstack grains组件
    Saltstack常用模块及API
    文本处理三剑客之AWK的用法
    linux程序调试命令strace
  • 原文地址:https://www.cnblogs.com/lizhuming/p/15486838.html
Copyright © 2011-2022 走看看