所以我讀了Developing C wrapper API for Object-Oriented C++ code,我喜歡這種方法,我用我的庫爲每個相應的C++類使用了不透明的句柄;避免使用void*
C++庫的C封裝 - 繼承是什麼?
但是現在,我正在考慮'接口'和基類。例如,我有一個「通道」類的類層次結構 - 「通道」的基類和派生的具體類,例如,串行通信,內存緩衝區,套接字等。
所以我有:
typedef struct serial_channel serial_channel;
typedef struct socket_channel socket_channel;
typedef struct memory_channel memory_channel;
serial_channel* create_serial_channel();
socket_channel* create_socket_channel();
memory_channel* create_memory_channel();
但我希望能夠對這些中的任何一個通到一個函數將其與「設備」對象相關聯:
void associate_device_with_channel(device*, channel*);
易於在C++中,因爲它理解基類。我如何在C包裝庫中解決這個問題 - 在C中是什麼類型的channel
?
我能想到的唯一事情就是我必須求助於void *來表示基類嗎?
typedef void* channel;
void associate_device_with_channel(device*, channel*);
它的工作原理,但將讓我過去任何指針?
在另一個極端,我可以寫匹配衍生通道類的一組功能:
void associate_device_with_serial_channel(device*, serial_channel*);
void associate_device_with_socket_channel(device*, socket_channel*);
void associate_device_with_memory_channel(device*, memory_channel*);
這是非常詳細的,如果我要添加新的渠道類型,我有新的功能添加到界面也是如此。
是否有某種中間層我失蹤了? - 像一個單一的功能,但不是void *?
而不是多個通道類型,請使用單一類型。當且僅當您需要提供僅適用於特定類型的頻道的專用功能時,才包含類型代碼。在這種情況下,類型檢查必須在運行時執行。 –
當您將基類(結構體)包含爲繼承類(結構體)的第一個元素時,您可以在C中實現繼承效果,利用指向結構對象的指針指向其初始成員的事實。檢查這個答案的例子http://stackoverflow.com/a/415536/2549281 – Dabo
@Dabo他不想在C中繼承。他試圖通過不透明的C句柄公開他的C++繼承結構。 – Sneftel