【面向对象】用C语言实现面向对象思想探讨。。。
c语言吧
全部回复
仅看楼主
level 11
pengzhenxx 楼主
前段时间和吧友探讨C语言的面向对象实现,但是发现很多人的思想并没有切换过来(还在用过程思想来看面向对象),或者死扣具体的封装、继承、多态等具体概念。。。。今天闲下来,用C语言具体实现了下。。。
先上代码,这是用C语言封装了一个字符串“类”,并“实例化”后,进行了一些常规操作。。。
运行效果是这样的:
2018年11月23日 13点11分 1
level 11
pengzhenxx 楼主
string.class.c这个文件有点多,不好截图,直接上代码了。。。
头文件:
string.class.c:
2018年11月23日 13点11分 3
level 11
pengzhenxx 楼主
string.class.c:
#include "string.class.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static STR* this = NULL;
static int length()
{
return strlen(this->string);
}
static char* subIndex(int index)
{
return (this->string+index);
}
static char* subString(const char* str)
{
return strstr(this->string,str);
}
static int indexOf(const char* str)
{
const char* p = strstr(this->string,str);
if(!p) return -1;
return p-this->string;
}
static char* join(const char* str)
{
int tz = strlen(this->string);
char* temp = (char*)malloc(tz+1);
memset(temp,0,tz);
strcpy(temp,this->string);
this->string = (char*)realloc(this->string,tz+strlen(str)+1);
memset(this->string,0,tz+strlen(str)+1);
sprintf(this->string,"%s%s",temp,str);
free(temp);
return this->string;
}
static void set(const char* str)
{
char* temp = (char*)malloc(strlen(str)+1);
memset(temp,0,strlen(str)+1);
strcpy(temp,str);
this->string = (char*)realloc(this->string,strlen(str)+1);
memset(this->string,0,strlen(str)+1);
strcpy(this->string,temp);
free(temp);
}
static void del()
{
if(this->string){
free(this->string);
this->string = NULL;
}
}
static int toInt()
{
return strtol(this->string,NULL,0);
}
static int cmp(const char* str)
{
if(strcmp(this->string,str)) return 0;
return 1;
}
static void upper()
{
char* p = this->string;
while(*p){
if(*p>='a' && *p<='z'){
*p = *p - ('a' - 'A');
}
++p;
}
p = NULL;
}
static void lower()
{
char* p = this->string;
while(*p){
if(*p>='A' && *p<='Z'){
*p = *p + ('a' - 'A');
}
++p;
}
p = NULL;
}
static float toFloat()
{
return strtof(this->string,NULL);
}
STR* new_string(const char* str)
{
this = (STR*)malloc(sizeof(STR));
memset(this,0,sizeof(STR));
this->length = length;
this->subIndex = subIndex;
this->subString = subString;
this->indexOf = indexOf;
this->join = join;
this->set = set;
this->del = del;
this->toInt = toInt;
this->cmp = cmp;
this->upper = upper;
this->lower = lower;
this->toFloat = toFloat;
this->string = (char*)malloc(strlen(str)+1);
memset(this->string,0,strlen(str)+1);
strcpy(this->string,str);
return this;
}
void delete_string(STR** obj)
{
del();
if(this){
free(this);
this = NULL;
}
*obj = NULL;
}
当然C语言是极其灵活的,我为了方便理解,故意写成了类似C++的类,也是可以不这么写的。。。就连这个维护这个“类”的指针,我也写成了this,C语言中是没有this这个关键字的。。。
,,,
此外还有继承、多态,其实C语言中的printf函数就已经具有部分的多态特性了,printf就一个函数,依据输入的不同,也完成了不同的功能,我本来还想讨论一下C语言中的可变参数函数写法,时间有限,大家可以搜索 stdarg.h 这个头文件,是C语言专门处理可变参数的,

继承其实也很容易实现,有函数指针,很容易把其他结构体中的“方法”地址,复制过来,达到代码重用和降低耦合度的目的
2018年11月23日 13点11分 5
level 7
可以实现 但没必要,因为麻烦 所以才会有上层语言
2018年11月23日 14点11分 6
level 7
毕竟万物起源于C
2018年11月23日 14点11分 7
level 11
pengzhenxx 楼主
@壹桌哟陡财徽cR 这个应该就是你以前最想看到的
2018年11月24日 09点11分 9
level 9
多态怎么实现 举个最简单的多态
base有print接口,a,b类继承base,重写print接口,有函数func(base* test) test->print
如何实现传入a,b调用其自身接口
2018年11月25日 01点11分 12
level 7
向大佬低頭,我現在卡在沒有面向對象的思考方式[狂汗],不過程式寫得出來就行,反正現在大部份都用C所以沒面向對象思考方式應該沒太大問題,現在最大的問題是不會用MPU9250
2018年11月27日 08点11分 13
1