1. ホーム
  2. c++

[解決済み] this' ポインタを 'const Line' から 'Line &' に変換できない?

2022-02-14 02:22:25

質問

この方法です。

bool Point::Intersects(const Line& line) const {
    return (line.ContainsPoint(*this, false));
}

このエラーは、'this' ポインタを 'const Line' から 'Line &' に変換できないことを意味します。 この変更は

bool Point::Intersects(const Line& line) const {
    return const_cast<Line&>(line).ContainsPoint(*this, false);
}

はエラーを修正しますが、問題を修正する正しい方法とは思えません。なぜ、元の方法がエラーとみなされるのでしょうか?

参考になれば。 ContainsPoint(const Point& point, bool isInfinite) は非定常であり、それが呼び出すすべてのメソッドも同様に非定常です。

解決方法は?

ある意味、自分で答えを出しているようなものですね。

あなたの Intersects メソッドでは、パラメータ line が宣言されています。 const . このため、この変数の使い方が制限されます。具体的には const を期待するメソッドにのみ渡すことができます。 const 行オブジェクトです。

しかし、ご指摘の通り ContainsPoint が宣言されていない const . そのため、上記の要件を満たしていません。 const メソッドを const オブジェクトは許可されません)。これが、元のメソッドがエラーを発生させる理由です。また、2番目のバージョンが動作する理由もここにあります。 const_cast .

本当の問題は ContainsPoint (そしておそらく、このメソッドが呼び出すすべてのメソッドも、非 const ). ここには大きな設計上の欠陥があるように思われます。というのも ContainsPoint があるかどうかをチェックすることです。 PointLine の場合、副作用は予期しないものになります。ですから、それが const メソッドを使用します。実際、(あなたの例が示すように)ユーザは Line 期待する ContainsPoint になります。 const メソッドを使用します。したがって、本当の解決策は、デザインを変更することです。 Line のようなメソッドが ContainsPoint が宣言されています。 const インスタンスの状態を明らかに変化させるメソッドのみを非 const