C语言面向对象(一)
1、简介
面向对象是一种思想,这里我们使用C语言实现具体细节,主要包含封装,继承和多态三方面类容,本小节主要介绍C语言如何实现封装。
2、C语言实现面向对象封装
学过C++,Java等面向对象语言的小伙伴应该知道,所谓封装就是指类的属性和方法(或者函数)实现封装,对C语言而言,C语言结构体提供了很好的属性封装,那对于方法(函数)的封装我们如何解决呢?这里我们使用函数指针实现对方法(函数)的封装。
#include<stdio.h>
#include<stdlib.h>
//forward declaration
struct Encapsulation;
void __init_encapsulation_fun(struct Encapsulation*this, int elemnt_a,int element_b);
void __delete_encapsulation_fun(struct Encapsulation*this);
int __get_element_a(struct Encapsulation*this);
void __set_element_a(struct Encapsulation*this,int element_a);
int __get_element_b(struct Encapsulation*this);
void __set_element_b(struct Encapsulation*this,int element_b);
//typedef funtion pointer declaration
typedef void (*INIT_ENCAPSULAtTION_FUN)(struct Encapsulation*this, int elemnt_a,int element_b);
typedef void (*DELETE_ENCAPSULATION_FUN)(struct Encapsulation*this);
typedef int (*GET_ELEMENT_A_FUN)(struct Encapsulation*this);
typedef void (*SET_ELEMENT_A_FUN)(struct Encapsulation*this,int element_a);
typedef int (*GET_ELEMENT_B_FUN)(struct Encapsulation*this);
typedef void (*SET_ELEMENT_B_FUN)(struct Encapsulation*this,int element_b);
typedef struct Encapsulation
{
//类属性
int element_a;
int element_b;
char*array;
//类方法
//构造函数
void (*InitEncapsulation)(struct Encapsulation*this, int element_a,int element_b);
//析构函数
void (*DeleteEncapsulation)(struct Encapsulation*this);
int (*GetElementA)(struct Encapsulation*this); //get elment_a
void (*SetElementA)(struct Encapsulation*this,int element_a); //set element_a;
int (*GetElementB)(struct Encapsulation*this); //get element_b
void (*SetElementB)(struct Encapsulation*this,int element_b); //set element_b;
}Encapsulation;
从上面的代码我们实现了最初步的类封装,接下来我们来介绍初始化方法。
//函数指针初始化
void classInit(
Encapsulation*ptr_encapsulation,
INIT_ENCAPSULAtTION_FUN __init_encapsulation_fun,
DELETE_ENCAPSULATION_FUN __delete_encapsulation_fun,
GET_ELEMENT_A_FUN __get_element_a,
SET_ELEMENT_A_FUN __set_element_a,
GET_ELEMENT_B_FUN __get_element_b,
SET_ELEMENT_B_FUN __set_element_b
){
ptr_encapsulation->InitEncapsulation = __init_encapsulation_fun;
ptr_encapsulation->DeleteEncapsulation = __delete_encapsulation_fun;
ptr_encapsulation->GetElementA = __get_element_a;
ptr_encapsulation->SetElementA = __set_element_a;
ptr_encapsulation->GetElementB = __get_element_b;
ptr_encapsulation->SetElementB = __set_element_b;
}
//具体函数(方法)实现
//构造函数
void __init_encapsulation_fun(struct Encapsulation*this, int element_a,int element_b)
{
this->element_a = element_a;
this->element_b = element_b;
this->array = NULL;
}
//析构函数
void __delete_encapsulation_fun(struct Encapsulation*this)
{
if(this->array != NULL){
free(this->array);
this->array = NULL;
}
}
int __get_element_a(struct Encapsulation*this)
{
return this->element_a;
}
void __set_element_a(struct Encapsulation*this,int element_a)
{
this->element_a = element_a;
}
int __get_element_b(struct Encapsulation*this)
{
return this->element_b;
}
void __set_element_b(struct Encapsulation*this,int element_b)
{
this->element_b = element_b;
}
对于C语言类的具体封装过程已经完成,下面我们来做具体测试
int main(int argc,char*argv[])
{
Encapsulation*object_Encapsulation =(Encapsulation*)malloc(sizeof(Encapsulation));
//函数指针初始化完成
classInit(object_Encapsulation,
__init_encapsulation_fun,
__delete_encapsulation_fun,
__get_element_a,
__set_element_a,
__get_element_b,
__set_element_b
);
//构造函数调用
object_Encapsulation->InitEncapsulation(object_Encapsulation,10,20);
//Get element_a
int a = object_Encapsulation->GetElementA(object_Encapsulation);
printf("%d\n",a); //10
return 0;
}
通过以上的封装和代码测试完成了C语言简单的面向对象封装,在此次设计中classInit()函数的作用是对函数指针的初始化,我们希望类的成员变量应该由类的成员函数操作,而不是外部函数。
完整代码如下
#include<stdio.h>
#include<stdlib.h>
//forward declaration
struct Encapsulation;
void __init_encapsulation_fun(struct Encapsulation*this, int elemnt_a,int element_b);
void __delete_encapsulation_fun(struct Encapsulation*this);
int __get_element_a(struct Encapsulation*this);
void __set_element_a(struct Encapsulation*this,int element_a);
int __get_element_b(struct Encapsulation*this);
void __set_element_b(struct Encapsulation*this,int element_b);
//typedef funtion pointer declaration
typedef void (*INIT_ENCAPSULAtTION_FUN)(struct Encapsulation*this, int elemnt_a,int element_b);
typedef void (*DELETE_ENCAPSULATION_FUN)(struct Encapsulation*this);
typedef int (*GET_ELEMENT_A_FUN)(struct Encapsulation*this);
typedef void (*SET_ELEMENT_A_FUN)(struct Encapsulation*this,int element_a);
typedef int (*GET_ELEMENT_B_FUN)(struct Encapsulation*this);
typedef void (*SET_ELEMENT_B_FUN)(struct Encapsulation*this,int element_b);
typedef struct Encapsulation
{
//类属性
int element_a;
int element_b;
char*array;
//类方法
//构造函数
void (*InitEncapsulation)(struct Encapsulation*this, int element_a,int element_b);
//析构函数
void (*DeleteEncapsulation)(struct Encapsulation*this);
int (*GetElementA)(struct Encapsulation*this); //get elment_a
void (*SetElementA)(struct Encapsulation*this,int element_a); //set element_a;
int (*GetElementB)(struct Encapsulation*this); //get element_b
void (*SetElementB)(struct Encapsulation*this,int element_b); //set element_b;
}Encapsulation;
//函数指针初始化
void classInit(
Encapsulation*ptr_encapsulation,
INIT_ENCAPSULAtTION_FUN __init_encapsulation_fun,
DELETE_ENCAPSULATION_FUN __delete_encapsulation_fun,
GET_ELEMENT_A_FUN __get_element_a,
SET_ELEMENT_A_FUN __set_element_a,
GET_ELEMENT_B_FUN __get_element_b,
SET_ELEMENT_B_FUN __set_element_b
){
ptr_encapsulation->InitEncapsulation = __init_encapsulation_fun;
ptr_encapsulation->DeleteEncapsulation = __delete_encapsulation_fun;
ptr_encapsulation->GetElementA = __get_element_a;
ptr_encapsulation->SetElementA = __set_element_a;
ptr_encapsulation->GetElementB = __get_element_b;
ptr_encapsulation->SetElementB = __set_element_b;
}
//具体函数(方法)实现
//构造函数
void __init_encapsulation_fun(struct Encapsulation*this, int element_a,int element_b)
{
this->element_a = element_a;
this->element_b = element_b;
this->array = NULL;
}
//析构函数
void __delete_encapsulation_fun(struct Encapsulation*this)
{
if(this->array != NULL){
free(this->array);
this->array = NULL;
}
}
int __get_element_a(struct Encapsulation*this)
{
return this->element_a;
}
void __set_element_a(struct Encapsulation*this,int element_a)
{
this->element_a = element_a;
}
int __get_element_b(struct Encapsulation*this)
{
return this->element_b;
}
void __set_element_b(struct Encapsulation*this,int element_b)
{
this->element_b = element_b;
}
int main(int argc,char*argv[])
{
Encapsulation*object_Encapsulation =(Encapsulation*)malloc(sizeof(Encapsulation));
//函数指针初始化完成
classInit(object_Encapsulation,
__init_encapsulation_fun,
__delete_encapsulation_fun,
__get_element_a,
__set_element_a,
__get_element_b,
__set_element_b
);
//构造函数调用
object_Encapsulation->InitEncapsulation(object_Encapsulation,10,20);
//Get element_a
int a = object_Encapsulation->GetElementA(object_Encapsulation);
printf("%d\n",a); //10
return 0;
}