假设你有一个库的头,看起来像这样:
struct lib_data;
struct lib_data *new_data();
void read_data(struct lib_data *data);
void clean_data(struct lib_data *data);
还有就是struct lib_data
向前声明没有指定其内容。然后,您的应用程序可以做到这一点:
struct lib_data *data = new_data();
read_data(data);
clean_data(data);
注意,你不知道什么struct lib_data
样子,甚至它的大小是什么知识。这就是不透明的含义。但是你可以持有一个指针并传递它。
在库的实现中(您可能访问或不可访问),该结构具有适当的定义,因此可以修改其元素。
例如,库的实现可能是这样的:
struct lib_data {
int data1
double data2;
}
struct lib_data *new_data()
{
struct lib_data *temp = malloc(sizeof(struct lib_data);
temp->data1 = 1;
temp->data2 = 3.5;
return temp;
}
void read_data(struct lib_data *data)
{
...
}
void clean_data(struct lib_data *data)
{
free(data);
}
所以库可以操纵struct
,但使用它的应用程序不能。
简单地说,C中的“opaque type”与C++中的抽象基类完全相同,除了不透明类型没有自动调用构造函数/析构函数。调用者只能声明一个指向给定类型的对象的指针,从不分配它,也不访问成员。 – Lundin