C语言面向对象的封装方法

原文

纯C语言实现简单封装继承机制_smstong的博客-CSDN博客

以下是补充实现简单演示一下思路,

函数带有包名、类名作为开头可以预防命名污染

一共  5个文件:

main.c

class_b.h

class_b.c

class_c.h

class_c.c

/* class_b.h */

/* beginning of private header file */
#ifndef _CLASS_B_H_
#define _CLASS_B_H_

#include <stdio.h>
#include <stdlib.h>

#define B_STRUCT \
	int x; \
	int y; \
	int z; \
	int (*b_member_function1)(B); \
	int (*b_member_function2)(B, int arg)

typedef struct B_s  *B;

struct B_s
{
    B_STRUCT;   
};


B    new_B();

#define del_B(b)\
	del_B_(&(b))
void del_B_(B *b);

int  b_member_function1(B b);

int  b_member_function2(B b, int arg);

#endif /* _CLASS_B_H_ */
/* ending private header file */
/* class_b.c */
#include "class_b.h"

B new_B()
{
	B b = (struct B_s*)malloc(sizeof(struct B_s));

	b->x = 0;
	b->y = 0;
	b->z = 0;

	b->b_member_function1 = b_member_function1;
	b->b_member_function2 = b_member_function2;

	return b;
}

void del_B_(B *b)
{
	free(*b);
	*b = 0;
}

int b_member_function1(B b)
{
	b->x = 1;
	b->y = 1;
	b->z = 1;

	return 0;
}

int b_member_function2(B b, int arg)
{
	b->x = arg;
	b->y = arg;
	b->z = arg;

	return 0;
}

void linebrk()
{
	printf("\n");
}
/* class_c.h */

/* beginning of private header file */

#ifndef _CLASS_C_H_
#define _CLASS_C_H_

/* Inheritance of classes */

/* inherit function */
#define C_STRUCT \
	B_STRUCT; \
	int n; \
	int (*c_member_function1)(C); \
	int (*c_member_function2)(C, int, int); \
	int (*c_member_function3)(C, int)
	
typedef struct C_s  *C;

struct C_s {
	C_STRUCT;
};

C    new_C();

#define del_C(c)\
	del_C_(&(c))

void del_C_(C *c);

int c_member_function1(C c);

/* overload class function */
int  c_member_function2(C c, int arg1, int arg2);

/* new class function */
int  c_member_function3(C c, int arg);

#endif /* _CLASS_C_H_ */
/* ending of private header file */
/* class_c.c */
#include "class_c.h"

C new_C()
{
	C c = (struct C_s*)malloc(sizeof(struct C_s));

	c->x = 0;
	c->y = 0;
	c->z = 0;

	c->c_member_function1 = c_member_function1;
	c->c_member_function2 = c_member_function2;
	c->c_member_function3 = c_member_function3;

	return c;
}

void del_C_(C *c)
{
	free(*c);
	*c = 0;
}

int c_member_function1(C c)
{
	return b_member_function1((B)c);
}

int c_member_function2(C c, int arg1, int arg2)
{
	b_member_function2((B)c, arg1);
	c->n = arg2;
	return 0;
}

int c_member_function3(C c, int arg)
{
	c->n = arg;
	return 0;
}
/* main.c */
#include <stdio.h>
#include "class_c.h"

int main(void)
{

    /* PART1: B CLASS object */

	printf("init B:\n");

	B b = new_B();
	printf("b %%p : %p\n", b);
	printf("b->x:%d, b->y:%d, b->z:%d\n", b->x, b->y, b->z);
	linebrk();


	printf("func1:\n");

	b->b_member_function1(b);
	printf("b->x:%d, b->y:%d, b->z:%d\n", b->x, b->y, b->z);
	linebrk();


	printf("func2:\n");

	b->b_member_function2(b, 3);
	printf("b->x:%d, b->y:%d, b->z:%d\n", b->x, b->y, b->z);
	linebrk();


	printf("del:\n");

	del_B(b);
	printf("b %%p : %p\n", b);
	linebrk();



    /* PART2: C CLASS object */

	printf("init C:\n");

	C c = new_C();
	printf("c %%p : %p\n", c);
	printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
	linebrk();


	printf("func1:\n");

	c->c_member_function1(c);
	printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
	linebrk();


	printf("func2:\n");

	c->c_member_function2(c, 3, 5);
	printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
	linebrk();


	printf("func3:\n");

	c->c_member_function3(c, 7);
	printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
	linebrk();


	printf("del:\n");

	del_C(c);
	printf("c %%p : %p\n", c);
	linebrk();


	return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值