在返回struct - const错误的函数中传递值

时间:2012-04-06 20:05:37

标签: c++ struct const

我在这个问题上花了大约两个小时,我之前访问过这些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

我会很乐意提供帮助,因为我一段时间都被困在这里:/

5 个答案:

答案 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::那真是令人尴尬,对不起:(

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