2

我在这个问题上花了大约两个小时,我之前访问过这些 stackoverflow 问题:

c++ 将 const 对象引用传递给函数

将 const& 作为函数参数传递

两者都没有帮助我,所以我在这里指定我的问题:

1)我有一个将 sPolygon存储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?

我会很高兴得到帮助,因为我被困在这里有一段时间了:/

4

5 回答 5

9

可以做到const,只是忘记在实现中限定名称。

          //class name
                ||
                \/
Tripel const& Polygon::findClosestPts (std::vector<Point2D> const& P, 
           std::vector<Point2D> const& X, std::vector<Point2D> const& Y) const
于 2012-04-06T20:07:36.110 回答
3

线索在错误消息中:

error: non-member function ...

此时您可以停止阅读,因为您的编译器认为您的函数是非成员函数。该行上的任何进一步文本都基于您的编译器做出不正确的结论(基于您想要的)。解决方案是将Polygon::限定符添加到您的成员函数实现中:

Tripel const& Polygon::findClosestPts( ...
于 2012-04-06T20:11:29.980 回答
2

您需要使用类名来限定函数名,例如

Tripel const& Polygon::findClosestPts (std::vector<Point2D> const& P, std::vector<Point2D> const& X, std::vector<Point2D> const& Y) const

Luchian 打败了我,但错误告诉你非成员不能有 cv 限定符,原因与静态函数不能被 cv 限定的原因相同

于 2012-04-06T20:09:36.500 回答
0

好吧...这不值得做所有的工作...我只是忘记了班级限定词Polygon::这真的很尴尬,我很抱歉:(

谢谢大家的帮助,我想问题已经解决了!

于 2012-04-07T16:10:39.863 回答
0

请注意,您最好返回这里:

Tripel const& findClosestPts (std::vector<Point2D> const& P,  
                                std::vector<Point2D> const& X,
                                std::vector<Point2D> const& Y) const;

Tripel 的值,而不是对它的引用。正如有人已经指出的那样,返回参考是不安全的。

此类函数几乎总是必须返回一个值,而不是引用,否则您将需要保持返回引用的对象的生命周期与相应地接受引用的对象/代码的生命周期。也就是说,返回对象的生命周期必须保持在接收对象或代码的生命周期内。

于 2012-04-06T21:08:39.953 回答