Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

建议采用面向对象的方式进行封装 #41

Open
ghost opened this issue Apr 19, 2017 · 0 comments
Open

建议采用面向对象的方式进行封装 #41

ghost opened this issue Apr 19, 2017 · 0 comments

Comments

@ghost
Copy link

ghost commented Apr 19, 2017

看了下你的源代码,写的很好,但是没有体现面向对象的思想,C为什么要面向对象?Linux内核就是最好的例子,Linux内核尽管是C和汇编写的,但是里面却大量使用了面向对象的思想,要不然它的代码怎么会写的如此精妙,同一份源代码能够支持几十种架构

另外你的API应该和C++ STL要类似,这样可以减少开发者的学习成本和更方便的使用,比如说C++的list里有哪些方法,你的libcstl应该提供对应的方法

之前我自己也封装过,但是对于自定义的类型处理不好,所以弃坑了......


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// list简单封装...

typedef void* Type;

typedef struct Node{
int data;
struct Node *next;
struct Node *prev;
}Node;

// 把所有的方法都封装在list里面,类似于class
typedef struct list{
void (*add) (Node *head,int data);
void (*insert) (Node *head,int data,int pos);
bool (*empty) (Node *head);
// ...
}list;

void list_add(Node *head,int data){
printf("data = %d\n",data);
}

bool list_empty(Node *head){
printf("list is empty...\n");
return false;
}

// 这个方法返回的是一个list结构体
list create_list(Type T){
list m_list = {
.add = list_add,
.empty = list_empty
};
// 进行链表的一些初始化,构造头节点...
// ...
return m_list;
}

// 这个方法返回的是一个list结构体指针,类似于C++的new
list* new_list(Type T){
list p_list = (list)malloc(sizeof(list));
p_list->add = list_add;
p_list->empty = list_empty;
// 进行链表的一些初始化,构造头节点...
// ...
return p_list;
}

/* main function */
int main(int argc,char **argv){
// 构造list对象,通过对象调用方法,这样就可以达到类似面向对象的效果
list mlist = create_list(NULL);
mlist.add(NULL,666);

list *plist = new_list(NULL);
plist->empty(NULL);

return 0;

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

0 participants