2

私はその問題に約2時間費やしました、そして私は以前にこれらのスタックオーバーフローの質問にアクセスしました:

constオブジェクト参照を関数に渡すc++

const&を関数の引数として渡す

どちらも役に立たなかったので、ここで問題を特定しています。

1)sをリストにPolygon格納するクラスがあります。Point2Dこのクラスには、特に2つのメンバー関数があります。

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は、関数の戻り値であるaも含まれていますfindClosestPts。関数は2つのポイントと1つの距離を返す必要があるため、これが必要です。

struct Tripel {
  Point2D pt1;
  Point2D pt2;
  float   dist;
};

問題は現在、Polygon.cppの実装にあります。これは、上記の2つの関数の(現在の)コードです。

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にし、3つのstd :: vectorを他の関数に渡す前にconstにしました...しかし、すべてが(異なる)コンパイルにつながりましたエラー。

したがって、私の質問は、次のことを実現するために、2つの関数をどのように記述する必要があるかということclosestPoints()です。パブリックメンバー関数であり、最も近い2つのポイントのペアを返す関数が必要です。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;

トリペルの値であり、それへの参照ではありません。誰かがすでに述べたように、これは参照を返すのは安全ではありません。

このような関数は、ほとんどの場合、参照ではなく値を返す必要があります。そうしないと、オブジェクトの存続期間が参照を返し、オブジェクト/コードの存続期間が対応して参照を受け入れるようにする必要があります。つまり、返されるオブジェクトの存続期間は、受信するオブジェクトまたはコードの存続期間内に維持する必要があります。

于 2012-04-06T21:08:39.953 に答える