我在OpenCV庫中使用C++,這是一個庫圖像處理,雖然這與此問題無關。目前我有一個設計決定。使用C編寫的庫的智能指針
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
。我不想重寫全局運算符刪除,因爲我只想將它應用於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
}
你會在我的情況下做什麼?請幫我把這個弄清楚。
我明白了你的觀點,但我想我可能會爲自己的智能指針而努力。我覺得因爲有很多不同的功能和類型,我覺得我正在重新改寫他們的簽名。雖然謝謝! – 2009-01-31 10:36:49