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