将复制构造函数添加到类中

时间:2015-11-17 11:30:06

标签: c++ c++11 overloading copy-constructor

是否可以为我没写过的类添加一个复制构造函数(换句话说就是重载它)?

例如,我正在使用一些具有Point类的库。我想为它添加一个拷贝构造函数。我不能也不想编辑它。

虚构语法:

cv::Point cv::Point::Point(const AnotherPoint& p){
    return cv::Point(p.x,p.y);
}

P.S我也没有写AnotherPoint

EDIT -Problem背景 - :

我想要使用标准函数std::vector<cv::Point>std::vector<AnotherPoint>复制到另一个std::copy的所有问题。所以我正在寻找一种方法来重载复制构造函数来实现它。

2 个答案:

答案 0 :(得分:5)

在定义之后,您无法将构造函数添加到类型中。

std::vector<cv::Point>复制到std::vector<AnotherPoint>的简单方法是使用std::transform

std::vector<cv::Point> cvPoints;
//cvPoints filled
std::vector<AnotherPoint> otherPoints;
otherPoints.reserve(cvPoints.size()); //avoid unnecessary allocations
std::transform(std::begin(cvPoints), std::end(cvPoints),
               std::back_inserter(otherPoints), 
               [](const cv::Point& p){ return AnotherPoint{p.x, p.y}; });

答案 1 :(得分:1)

这是不可能的。

你可以做相反的事情,即从你的类型(AnotherPoint)到另一个(cv::Point)定义隐式conversion operator

这样,您就可以在预期AnotherPoint的任何地方使用cv::Point类型的对象。

如果您也无法控制AnotherPoint,我想唯一的方法就是定义一个独立功能,从而创建一个cv::Point AnotherPoint

OP编辑后:

最后,要将vector<cv::Point>转换为vector<AnotherPoint>,您可以使用上面提到的独立函数作为std::transformunary_op,正如@TartanLlama建议的那样。