2014-03-24 47 views
3

典型的C庫是這樣的:我應該如何包裝的C庫爲C++

foo_t * foo_open(); 
int  foo_query(foo_t *); 
int  foo_close(foo_t *); 

我可以看到那些包裝成sleak 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()); 
} 

現在,我正在使用第二種解決方案,但主要是因爲我懶得編寫所有的成員函數。有一個原因是爲什麼一種方法應該比另一種方法更受歡迎?

+1

檢查此建議:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3677.html是否有意向標準庫添加通用RAII-wrappers。它可以給你一些想法。 – Manu343726

+0

另請參閱:http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html –

回答

5

第一種方法是更多的C++方法。所有的功能被組合在一起成爲一個邏輯單元(類),你已經封裝了數據,以便RAII防止資源泄漏,並且你也設法放棄了前綴foo_

+0

另外,如果C庫設計良好,它的接口不應該更改太頻繁,所以寫無論如何,包裝只是一次性的工作。而且,如果你不得不做很多這樣的事情,你甚至可以自動化,只需要做一些手動調整。 – CompuChip