2011-11-25 44 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())