C實現JAVA類似ArrayList的靜態連結庫
阿新 • • 發佈:2018-11-30
檔案結構:
- ArrayList.h:標頭檔案
- ArrayList.c:實現標頭檔案中的功能
- ArrayListTest.c:測試
ArrayList.h
標頭檔案的基本框架:
#ifndef _ARRAYLIST_H
#define _ARRAYLIST_H
// 標頭檔案體
#endif
標頭檔案中應包含結構體定義,必要的巨集定義,需要直接在其他檔案中使用的函式的定義
Java中的ArrayList是實現引用的陣列,而不是物件的陣列,在連續的儲存空間中存放的是引用,而不是物件實體,所以在實現的時候採用void**,那麼這樣實現的ArrayList將可以含有任意型別的變數,壞處就是需要在使用的時候人為的解析
capacity是當前item_list申請的長度
my_size是當前item_list中存放了多少個元素。之所以不用size是為了和接下來實現的size函式區別
為實現通過結構體通過呼叫成員的方式呼叫函式,而不是直接通過函式名呼叫函式。在結構體中宣告函式指標用以呼叫函式。這樣就可以在ArrayList.c中將函式的作用域宣告為只有本檔案可見,避免和其他庫函式函式名衝突。但是因為結構體中包含這個檔案中函式的指標,仍然可以呼叫函式。
typedef struct ArrayList ArrayList; struct ArrayList{ void** item_list; int capacity; int my_size; // 函式指標 }
為實現函式指標的賦值,需要宣告初始化函式,在初始化函式中將函式指標賦值,所以這兩個函式就不能放到結構體中:
// create a new ArrayList
int init_ArrayList(ArrayList*);
// create a new ArrayList with specified capacity
int init_ArrayList_capacity(ArrayList*,int capacity);
ArrayList.c
包含標頭檔案,實現函式
因為這些函式無法知道是哪個結構體呼叫自己的,所以都需要將呼叫的結構體傳進去
ArrayListTest.c
包含標頭檔案
呼叫的方式類似:
al.retainAll(&al,aap+3,11);
al.trimToSize(&al);