2011-03-25 41 views
1

我將在我的C++應用程序中大量使用一些C-API,我有很多可用的功能,需要在幾個對話框中調用。例如開始時的createFoo(void *)和完成後的freeFoo(void *)。使用引用計數邏輯的API封裝器C++

所以,我想使用RAII成語,所以我創建了第一個包含複製構造函數和賦值運算符private的包裝,並未實現。它工作正常,但我想要一個更豐富的副本語義。我想使用引用計數複製語義。我已經考慮寫我自己的版本,但我不想重新發明輪子。另外,boost :: shared_ptr已經實現了我想實現的很多行爲。

唯一的區別是指針不是用new創建的,它不是用delete來釋放的。我想定製源和宿功能。

我覺得這是面對問題的好方法,但是我不能想出一個實現我的想法的課程。

以下是問題,你認爲這是解決我的問題的好方法嗎?有沒有實現類似的開源代碼?你有什麼提示嗎?

謝謝

回答

8

這真的很容易。舉個例子,假設你有Ç的fopen接口:

FILE* fopen(blah); 
int fclose(FILE*); 

然後你可以用文件資源與shared_ptr的是這樣的:

shared_ptr<FILE> ptr(fopen("file.txt", "rt"), fclose); 
// use the file pointed by ptr 
fwrite(..., ptr.get()); 

// FILE is automatically closed by a call to fclose when 
// reference count drops to zero... 

編輯:讓我來解釋一下。 shared_ptr與所有權和弱所有權參考計數器一起存儲「刪除者」。刪除器是可以使用指向資源的指針作爲參數釋放的任何對象。默認的刪除器只是在其參數上調用delete,但是您可以傳遞您自己的刪除器。

當我應用上述技巧時,通常會將創作包裝到單獨的功能中。這簡化了代碼,並允許我檢查從C風格的API返回的錯誤代碼並將它們轉換爲異常:

shared_ptr<FILE> MakeFile(const char* name, const char* mod) 
{ 
    if(FILE *ptr = fopen(name, mod)) 
     return shared_ptr<FILE>(ptr, fclose); 

    throw SomeExceptionType("fopen", errno, ...); 
}