2011-11-25 45 views
1

我想了解在我使用的庫中實現的類中使用的構造函數。類SequenceAnalyzer的主要組成部分是這樣的:通過引用對象構造一個類

class SequenceAnalyzer { 
    protected: 
    std::vector<cv::Mat> images_; 

    public: 
    SequenceAnalyzer(std::vector<cv::Mat> *images = NULL) 
    { 
     if (images != NULL) 
      images_ = (*images); 
    } 

}; 

當我的主要構建這個類的一個實例,我將它傳遞一個參考向量:

std::vector<cv::Mat> myImages; 
SequenceAnalyzer se(&myImages); 

現在在我的圖像通過引用傳遞將他們的位置傳遞給班級。但是我對(* images)操作符的理解意味着它們的地址已被解除引用,因此=操作符會複製這些內容。

以這種方式將myImages傳入課程有什麼好處嗎?爲什麼指針首先被使用,如果它不以保存的複製開銷結束呢?

+2

我在這裏沒有看到任何引用。 –

+0

如果你指的是引用和指針之間的區別,恐怕這對我來說是一個朦朧的話題。如果您指的是我在說的是哪個庫,則是[OpenCV Structure from Motion library project](http://code.google.com/p/gsoc2011sfm/)。 – Chris

+0

您將它作爲指針傳遞給'vector '對象myImages。 – Praveen

回答

1

沒有任何優勢。我會寫相同的代碼爲:

SequenceAnalyzer(const std::vector<cv::Mat>& images = std::vector<cv::Mat>()) : 
    images_(images) 
{ 
} 

現在我並不需要擔心指針:

std::vector<cv::Mat> myImages; 
SequenceAnalyzer se(myImages); 
+0

我想他是在問價值傳遞參考 - _或_指針_vs_,而不是兩者之間。 –

+0

@ TomalakGeret'kal:也許,但這個問題還不清楚。 – ybungalobill

+1

至於引用vs指針,我的印象是C++傾向於更喜歡在函數定義中使用引用,而不是指針,但這只是我的印象。上面的代碼當然看起來比原始代碼更有吸引力。 – Chris

0

的指針(或引用)傳遞參數,而不是由價值避免臨時副本。所以複製只在需要時完成,而不是在作爲參數傳遞時完成。另一個優點是你可以有一個NULL默認參數,而不需要創建一個默認的構造函數。在這種情況下,隱式默認構造函數應該做同樣的事情。

更優雅的方式可以是這樣:

SequenceAnalyzer(const std::vector<cv::Mat>& images) { 
    images_ = images; 
} 

無臨時副本(你是通過引用傳遞),以及誰在使用,這是肯定的圖像不會被修改。

+1

但是,他們在原始帖子中的做法是非常糟糕的C++風格:) –

+0

您也可以使用參考方式具有默認參數。 –

+0

@ TomalakGeret'kal是的,但它必須是一個實例化的對象。 –

1

當我的主要構建這個類的一個實例,我將它傳遞一個 參考向量:

std::vector<cv::Mat> myImages; 
SequenceAnalyzer se(&myImages); 

不,你不知道。

&上的一個類型表示一個引用類型;表達式上的&是「address-of」運算符併產生一個指針!這就是爲什麼你的構造函數接受一個指針,否則這是行不通的。

立即傳遞我的圖片由 參考 [指針]在存儲器 到類通過它們的位置。但是我對(*images)運營商的理解意味着 他們的地址已被取消引用,因此=運營商然後 複製內容。

正確。

以這種 的方式將myImages傳入班級有什麼好處嗎?爲什麼指針首先被使用,如果它不以 結束仍然保存複製開銷?

推測程序員想避免被複制兩次載體(一次用於參數並再次存儲作爲一個成員)。不過,用指針而不是參考來做這件事是很不尋常的。


我會代替書面:

class SequenceAnalyzer { 
    protected: 
    std::vector<cv::Mat> images_; 

    public: 
    SequenceAnalyzer(const std::vector<cv::Mat>& images = std::vector<cv::Mat>()) 
     : images_(images) {}; 
}; 

現在,你有你的參考參數,默認的,也是你正確初始化。

0

即使您複製矢量,您也可以獲得一些幫助,只複製圖像標題(包含類型,寬度,高度等的結構)。 Mat對象封裝了數據的智能指針,因此只有在調用特定函數時纔會發生圖像數據的深層副本(Mat :: copyTo(),Mat :: clone())