如何将C库封装到c++中

How should I wrap C libraries into C++

本文关键字:c++ 封装      更新时间:2023-10-16

典型的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_前缀!