创建ADT对象的接口

有2种方法和一种不好的方法

主调函数传递二级指针

假设我们有

1
2
3
typedef struct{
// ...
}ADT_TYPE;

想要在main()函数中创建一个ADT_TYPE类型的对象,那么可以这样实现接口:

1
2
3
4
5
6
7
8
9
10
11
12
void create_ADT_TYPE(ADT_TYPE** objp){
ADT_TYPE *temp = (ADT_TYPE*)malloc(sizeof(ADT_TYPE)); // malloc
// init ADT object
*objp = temp; // Point *objp to temp
}
int main(void){
ADT_TYPE * obj;
create_ADT_TYPE(&obj);
// other operations
free_ADT_TYPE(obj);
return 0;
}

main()调用create_ADT_TYPE()时传递obj的指针,也就是一个二级指针,以达到在create_ADT_TYPE()直接修改obj指向的目的.

接口函数返回对象指针

同样假设有:

1
2
3
typedef struct{
// ...
}ADT_TYPE;

想要在main()函数中创建一个ADT_TYPE类型的对象,那么可以这样实现接口:

1
2
3
4
5
6
7
8
9
10
11
12
ADT_TYPE* create_ADT_TYPE(void){
ADT_TYPE *temp = (ADT_TYPE*)malloc(sizeof(ADT_TYPE)); // malloc
// init ADT object
return temp;
}
int main(void){
ADT_TYPE * obj;
obj = create_ADT_TYPE();
// other operations
free_ADT_TYPE(obj);
return 0;
}

全局静态指针

这样的写法很不好,这意味着一个程序只能创建一个ADT_TYPE的对象.

在ADT_TYPE.h中如下:

1
2
3
4
5
typedef struct{
// ...
}ADT_TYPE;

void create_ADT_TYPE(void);

在ADT_TYPE.c中有如下实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
static ADT_TYPE* glob_obj;

void create_ADT_TYPE(void){
glob_obj = (ADT_TYPE*)malloc(sizeof(ADT_TYPE)); // malloc
// init ADT object
// But directly manipulate the global static glob_obj variable
}

void free_ADT_TYPE(void){
// other operations
free(glob_obj);
glob_obj = NULL;
}

在main.c中如下使用该ADT:

1
2
3
4
5
6
7
#include "ADT_TYPE.h"
int main(void){
create_ADT_TYPE();
// other operations
free_ADT_TYPE();
return 0;
}

这样写,用户代码(main()函数)仅仅只能依靠接口函数进行沟通,而且如果没有特殊的处理,最多只能创建一个对象,即glob_obj指向的对象.

需要返回复合结果的操作接口