C语言模拟C++的私有封装

C++面向对象是一种编程思想,当然编译器也提供了实现。C编译器是面向过程的编程语言,当然可以利用其现有的语法规则及编译器功能来模拟面向对象的这种编程思想。

1 数据成员私有封装

1.1 私有数据放在一个单独的源文件中,定义为全局的static;

1.2 在头文件中定义一个结构体,封装指向私有数据类型的指针、访问器(函数指针,访问私有数据,以私有数据类型为函数参数);

//test.h
#pragma once

struct PrivateData;     // private data declaration
struct privateDataOp    // private data operation
{
    struct PrivateData *ppd;
    void (*pget)(struct privateDataOp *p);
    void (*pset)(struct privateDataOp *p,int num);
};

void get(struct privateDataOp *p);
void set(struct privateDataOp *p,int num);

// test.c
#include "test.h"

struct PrivateData              // private data definition
{
    int num;
};
static struct PrivateData pd;   // private data

void get(struct privateDataOp *p)
{
    p->ppd=&pd;
    printf("%d",p->ppd->num);
}

void set(struct privateDataOp *p,int num)
{
    p->ppd=&pd;
    p->ppd->num=num;
}

//main.c
#include 
#include 
#include "test.h"

void main()
{
    struct privateDataOp pd;
    pd.pset = set;
    pd.pget = get;
    pd.pset(&pd,100);
    pd.pget(&pd); // 100
    getchar();
}

2 成员函数私有封装

封装两个函数指针,一个函数指针指向打算私有的函数,一个函数指针指向的函数是有条件的调用打算私有的函数的函数。

// test.h
#pragma once

struct MyStruct
{
    int money;
    void (*pprivateFunc)(struct MyStruct *p);   // private member function
    void (*pprivateFuncPub)(struct MyStruct *p, char* pass); // let private public
};

void privateFunc(struct MyStruct *p);       // implemented by static
void privateFuncPub(struct MyStruct *p, char* pass);

// test.c
#include "test.h"

static void privateFunc(struct MyStruct *p)
{
    printf("%d",p->money);
}

void privateFuncPub(struct MyStruct *p,char* pass)
{
    if(!strcmp(pass,"wwu"))
        privateFunc(p);
}

// main.c
#include 
#include 
#include "test.h"

void main()
{
    struct MyStruct ms;
    ms.money = 100;
    ms.pprivateFuncPub = privateFuncPub;
    ms.pprivateFuncPub(&ms,"wwu");// 100
    getchar();
}

ref

https://www.bilibili.com/video/BV1w54y1L7iu?p=715

-End-

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章