假設你有一個庫的頭,看起來像這樣:
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