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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值