如何将C库封装到c++中
How should I wrap C libraries into C++
典型的C库是这样的:
foo_t * foo_open();
int foo_query( foo_t * );
int foo_close( foo_t * );
我可以看到两种将它们包装到松散的RAII结构中的方法。我可以创建一个类并包装每个C函数:
class foo
{
public:
foo(): m_impl( foo_open() ) { }
~foo() noexcept { foo_close( m_impl ); }
int query() { return foo_query( m_impl ) };
};
或者我可以使用智能指针和自定义析构函数:
class foo_destructor
{
public:
void operator()( foo_t * const obj ) noexcept
{
foo_close( obj );
}
};
typedef std::unique_ptr< foo_t, foo_destructor > foo_ptr;
,并直接使用C接口。
int main()
{
foo_ptr my_foo( foo_open() );
foo_query( my_foo.get() );
}
现在,我正在使用第二种解决方案,但主要是因为我懒得写所有的成员函数。一种方法是否真的比另一种更受欢迎?
第一种方法是更c++的方法。所有的功能都被组合到一个逻辑单元(类)中,您已经封装了数据,以便RAII可以防止资源泄漏,并且您还设法删除了foo_
前缀!
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将可变参数函数的参数封装在类实例中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 封装C++模板
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 从封装在对象中的函数 C++ 返回时为空的列表
- 当要访问的对象被多次封装时,如何正确使用setter
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 如何在类中封装C/C++套接字发送和接收函数?
- 如何使用吸气剂方法实现C++封装
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 类C++友元函数无法访问封装的类
- 当从成员类调用封装的std::begin时,程序崩溃
- 从私有成员类中断封装派生的模板类
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 如何修复列表视图中的错误?,封装控件时无法选择任何项
- 我们可以使用命名空间实现封装吗?
- 封装 std::vector 以允许迭代,但不允许其他内容
- lambda[=] 上的复制值被另一个封装的 lambda[&] 阻止
- 如何使用提升范围将自定义迭代器封装在函数中