【发布时间】:2014-03-04 11:50:59
【问题描述】:
所以我已经阅读了Developing C wrapper API for Object-Oriented C++ code 并且我喜欢我在我的库中采用的方法 - 每个对应的 C++ 类的不透明句柄;避免使用void*
但现在,我面临着关于“接口”和基类的思考。例如,我有一个“通道”类的类层次结构——“通道”的基类和派生的具体类,例如串行通信、内存缓冲区、套接字等。
所以我有:
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*);
它有效,但可以让我传递 any 指针吗?
另一方面,我可以编写一组与派生通道类匹配的函数:
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*?
【问题讨论】:
-
不要使用多种渠道类型,而是使用单一类型。当且仅当您需要提供仅适用于特定类型通道的专用功能时,才包含类型代码。在这种情况下,必须在运行时强制执行类型检查。
-
当你将你的基类(struct)作为继承类(struct)的第一个元素时,你可以在C中实现继承效果,利用指向结构对象的指针指向其初始的事实成员。检查此答案以获取示例stackoverflow.com/a/415536/2549281
-
@Dabo 他并没有尝试在 C 中进行继承。他试图通过不透明的 C 句柄公开他的 C++ 继承结构。
标签: c++ c inheritance wrapper