Skip to content

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

Description

看了下你的源代码,写的很好,但是没有体现面向对象的思想,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;

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions