C语言面向对象编程之基类。

C语言 专栏收录该内容
4 篇文章 0 订阅

说在前边

       我们作为一个程序员,C语言可以说是最开始入门的语言,它让我们接触了程序的奥妙,当我们慢慢的接触了C++,Java或者其他更加高级的语言时会发现C语言使用起来很不方便,其中之一就是,以我个人为例,一开始学习C语言是用来编写单片机程序的(面向过程的),在我初级印象当中,c语言是面向过程的。那么怎么样它具有面向对象的性质呢?一开始,我们会发现,c语言里边会有结构体struct,和c++中的类是很相似的,同时C语言接头体里边可以包含函数指针,那么我们针对帧一点开始动手做自己的C语言面向对象lib。我们参考万物皆有祖宗的思想写一个基类(Java的想法)。

     下面的代码是我在github上边找到的,各位可以在 github 上搜索 CSubSub 即可搜索到

CSubSub

基类头文件

//
//  cssObject.h
//  CSubSub
//
//  Created by plters on 14-5-20.
//  Copyright (c) 2014年 plter. All rights reserved.
//


#ifndef __CSubSub__cssObject__
#define __CSubSub__cssObject__


#ifdef __cplusplus
extern "C" {
#endif


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


void logOff();
void logOn();
void logOut(char * msg);


#define cssClass(name) typedef struct name{name##Fields(struct name *)}name;
///对象转换,这里只能将子类转换成父类_宏定义
#define cssAs(type,object) ((type)(object))
///对象内存给分配_宏定义
#define cssAlloc(__class__) cssAs(__class__ *,malloc(sizeof(__class__)))
///对象内存个释放_宏定义
#define cssDelloc(object) free(object)
///对象,结构体,内存给拷贝_宏定义 @Add by JasonHuo
#define cssObjCpy(pObjSrc,pObjDst,TYPE) memcpy(pObjDst,pObjSrc,sizeof(TYPE))


///基类宏定义
//TYPE is type of the class that you wanna to create
#define cssObjectFields(TYPE) \
    int _retainCount;\
    void (*retain)(TYPE _this);\
    void (*release)(TYPE _this);\
    int (*retainCount)(TYPE _this);\
    void (*onDelloc)(TYPE _this);


cssClass(cssObject)


cssObject* cssObjectInit(cssObject *_this);


#ifdef __cplusplus
}
#endif


#endif /* defined(__CSubSub__cssObject__) */


基类源文件

//
//  cssObject.c
//  CSubSub
//
//  Created by plters on 14-5-20.
//  Copyright (c) 2014年 plter. All rights reserved.
//

#include "cssObject.h"


static int _isLogOn = 0;

void logOff(){
	_isLogOn = 0;
}
void logOn(){
	_isLogOn = 1;
}
void logOut(char * msg){
	if (_isLogOn) {
		time_t t = time(NULL);
		struct tm* tm = localtime(&t);
		printf("[%d:%d:%d]%s\n",tm->tm_hour,tm->tm_min,tm->tm_sec,msg);
	}
}


static void cssObjectRetain(cssObject *_this){
	_this->_retainCount++;
}

static void cssObjectRelease(cssObject *_this){
	_this->_retainCount--;
	if (_this->_retainCount<=0) {
		_this->onDelloc(_this);
		cssDelloc(_this);
	}
}

static int cssObjectRetainCount(cssObject *_this){
	return _this->_retainCount;
}

static void cssObjectOnDelloc(cssObject *_this){
	logOut("Destroy cssObject");
}


cssObject* cssObjectInit(cssObject *_this){
	_this->_retainCount = 1;
	_this->onDelloc = &cssObjectOnDelloc;
	_this->release = &cssObjectRelease;
	_this->retain = &cssObjectRetain;
	_this->retainCount = &cssObjectRetainCount;
    
	logOut("init cssObject");
	return _this;
}

后面会使用这个基类来实现我们C++常用到的容器

本文URL:http://blog.csdn.net/qq_21193563/article/details/78332069

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值