我在这个问题上花了大约两个小时,我之前访问过这些stackoverflow问题:
c++ passing a const object reference to a function
Passing const& as a function argument
两个都没有帮助我,所以我在这里指出我的问题:
1)我有一个类Polygon
,它将Point2D
存储在一个列表中。该课程有两个成员函数:
public:
std::pair<Point2D,Point2D> closestPts() const;
private:
Tripel const& findClosestPts (std::vector<Point2D> const& P,
std::vector<Point2D> const& X,
std::vector<Point2D> const& Y) const;
2)该类还包含struct Triple
,它是函数findClosestPts
的返回值。我需要这个,因为函数需要返回两个点和一个距离:
struct Tripel {
Point2D pt1;
Point2D pt2;
float dist;
};
现在问题在于Polygon.cpp的实现。这是我上述两个函数的(当前)代码:
std::pair<Point2D,Point2D> Polygon::closestPts() const {
...
int size = m_points.size();
std::vector<Point2D> P (size);
std::vector<Point2D> X (size);
std::vector<Point2D> Y (size);
...
// some manipulation of the vectors, filling them with Point2D
// at this point, I have three non-const std::vector<Point2D>
// try to call the other function
Tripel closPts = findClosestPts(P, X, Y);
...
}
Tripel const& findClosestPts (std::vector<Point2D> const& P, std::vector<Point2D> const& X, std::vector<Point2D> const& Y) const {
...
}
编译错误是:
error: non-member function 'const Tripel& findClosestPts(...)' cannot have cv-qualifier
所以我想我不允许这个函数const
,因为它返回struct
。这是真的吗?
无论如何,我将函数签名更改为:
Tripel const& findClosestPts (std::vector<Point2D> const& P,
std::vector<Point2D> const& X,
std::vector<Point2D> const& Y);
因此,该函数不再是const
。这导致以下编译错误:
error: passing 'const Polygon' as 'this' argument of 'const Tripel& Polygon::findClosestPts(...)' discards qualifiers [-fpermissive]
我不知道,现在该做什么。我几乎尝试了所有的东西,删除所有的const语句,改变它们,使findClosestPts
公开,再次使它成为const,使三个std :: vectors const在传递给另一个函数之前...但是所有引导(不同)编译错误。
所以我的问题是,我如何编写这两个函数,以实现以下目的:我希望有一个函数closestPoints()
,它是一个公共成员函数,它返回两个最接近点的对。为此,它需要一个辅助的私有成员函数findClosestPts(vector1, vector2, vector3)
,它返回上面提到的struct Triple
?
我会很乐意提供帮助,因为我一段时间都被困在这里:/
答案 0 :(得分:9)
您可以将其设为const
,您只是忘了在实施中对该名称进行限定。
//class name
||
\/
Tripel const& Polygon::findClosestPts (std::vector<Point2D> const& P,
std::vector<Point2D> const& X, std::vector<Point2D> const& Y) const
答案 1 :(得分:3)
线索在错误消息中:
error: non-member function ...
此时您可以停止阅读,因为您的编译器认为您的函数是非成员函数。该行上的任何其他文本都是基于您的编译器做出错误的结论(基于您想要的)。解决方案是将Polygon::
限定符添加到成员函数实现中:
Tripel const& Polygon::findClosestPts( ...
答案 2 :(得分:2)
您需要使用类名称
来限定函数名称Tripel const& Polygon::findClosestPts (std::vector<Point2D> const& P, std::vector<Point2D> const& X, std::vector<Point2D> const& Y) const
Luchian打败了我,但是错误告诉你非成员不能拥有cv限定符,原因与静态函数不能被cv限定相同
答案 3 :(得分:0)
请注意,你最好回到这里:
Tripel const& findClosestPts (std::vector<Point2D> const& P,
std::vector<Point2D> const& X,
std::vector<Point2D> const& Y) const;
Tripel的价值,而不是对它的引用。 正如有人指出的那样,返回引用是不安全的。
这些函数几乎总是必须返回一个值,而不是一个引用, 否则,您将需要保持对象的生命周期返回引用,对象/代码的生命周期接受对应的引用。也就是说,返回对象的生命周期必须保持在接收对象或代码的生命周期内。
答案 4 :(得分:0)
好吧......这不值得所有的工作......我只是忘记了课程资格Polygon::
那真是令人尴尬,对不起:(
谢谢大家的帮助,我认为问题已经解决了!