C++面向对象是一种编程思想,当然编译器也提供了实现。C编译器是面向过程的编程语言,当然可以利用其现有的语法规则及编译器功能来模拟面向对象的这种编程思想。
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 条评论) “” |