2011-03-25 92 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, ...); 
}