【发布时间】:2010-10-04 15:46:16
【问题描述】:
我将 C++ 与 OpenCV 库一起使用,这是一个库图像处理,尽管这与这个问题无关。目前我有一个设计决定要做。
OpenCV 是一个 C 库,其数据结构(例如 CvMat)被声明为结构。要创建它们,可以使用 cvCreateMat 之类的函数,要释放它们,请使用 cvReleaseMat 之类的函数。作为一名 C++ 程序员,我创建了一个特殊的 cv_scoped 类,当它超出范围时会自动调用 cvReleaseMat(如 boost::scoped_ptr)。
我现在意识到的是,我希望我也可以在案例中使用 auto_ptr 和 shared_ptr。我只是觉得为我自己的cv_auto_ptr 和cv_shared_ptr 类编写代码将是一个坏主意,更不用说浪费时间了。所以我一直在寻找解决方案,我想出了三种可能性。
首先,我可以使用我已经创建的 cv_scoped 类。我将它重命名为cv_ptr,然后像这样使用智能指针:std::auto_ptr<cv_ptr>。不过,令人讨厌的是,我总是不得不取消引用两次:
std::auto_ptr<cv_ptr> matrix(cv_ptr(cvCreateMat(320, 240, CV_32FC3)));
cvPow(matrix.get()->get()); // one get for the auto_ptr, one for the cv_ptr
我知道我可以声明一个隐式转换,但实际上我不能 - 大多数 OpenCV 的函数都有参数 void* - 所以不会调用隐式转换。我真的很想要一种不必进行双重取消引用的方法。
第二,我可以以某种方式覆盖operator delete。我不想覆盖全局运算符 delete,因为我只希望它适用于 CvMat(和其他一些)类型。但是,我无法更改库,因此无法将 operator delete 添加到 CvMat 结构中。所以我不知道这会如何工作。
第三,我可以重写我自己的auto_ptr、scoped_ptr 和shared_ptr。他们不是大班,所以不会太难,但我只是觉得这是糟糕的设计。如果我要这样做,我可能会按照以下方式做一些事情:
class cv_auto_ptr {
public:
cv_auto_ptr();
~cv_auto_ptr();
// each method would just be a proxy for the smart pointer
CvMat* get() { return this->matrix_.get()->get(); }
// all the other operators/methods in auto_ptr would be the same, you get the idea
private:
auto_ptr<cv_ptr> matrix_; // cv_ptr deletes CvMat properly
}
在我的情况下你会怎么做?请帮我解决这个问题。
【问题讨论】:
标签: c++ opencv smart-pointers raii