質問

今、私はstd :: pairを使用してc ++の2dポイントを表現しています。しかし、私は書く必要があることに悩まされています

typedef std::pair<double, double> Point;

Point difference = Point(p2.first - p1.first,
                         p2.second - p1.second);

operator +およびoperator-をオーバーロードできる代わりに。

だから、私の質問は、Pointクラスを作成するために、私は

  • std :: pairからパブリックに派生し、独自のメンバー関数を追加しますか?私のコードはすべて同じままにできるため、これは素晴らしいことです。 std::pair<double, double>* p = new Point;のようなことをするつもりはないので、仮想デストラクタのようなことを心配する必要はありません。
  • 独自のPointクラスをロールします。std:: pairの機能を複製しているので迷惑ですが、<!> quot;それを純粋な方法で実行します<!> quot;。
  • std :: pairに対してoperator +およびoperator-のテンプレート特化を作成します。これらは、ソースファイルとヘッダーファイルのどちらに行くか覚えていません。

議論の余地があると思いますが、私は本当に#1をやりたいのですが、STLから継承することはノーだと聞いたので、それが悪い考えかどうかわかりません。

役に立ちましたか?

解決

独自のPointクラスをロールできますが、std :: pairを内部的に使用してデータを保存します。これにより、STLの問題からの継承が防止されますが、std :: pairの機能が引き続き使用されます。

他のヒント

独自のローリングよりも優れている:既存の無料のベクター/ポイントライブラリを入手します。 1つの推奨事項: Essential Math for Games Programmers に添付されているもの。見つけたライブラリを出発点として使用し、そこから最適化/特殊化/微調整できます。

独自のPointクラスを作成し、std :: pairの機能を使用する場合は、プライベート継承またはコンポジションを使用します。 typedefの問題(あなたが承知していると思いますが)は、Pointを取る任意の関数は、std :: pair <!> lt; double、double <!> gt;として表されるものでも使用できることです。 、有効でない可能性があります。

これを念頭に置いて、次のような無料のビルダー関数を作成するという別のオプションがあります

Point addPoints(const Point& p1, const Point& p2);
Point diffPoints(const Point& p1, const Point& p2);

(関数名の方が優れている可能性があります)。

もう1つのオプションは、Pointクラスを所有し、クラスを<!> quot; own <!> quot;にすることです。ポイント座標を表すstd :: pair。

多くの場合<!> quot; HAS A <!> quot; (組成)関係は<!> quot; IS A <!> quotよりも望ましいです。 (継承)関係。

<!> quot;ベストプラクティス<!> quot;独自のPointクラスをロールバックすると言います。このようにして、3Dをずっと簡単にすることができます。

プライベート継承、つまり実装の継承はあなたの友達です。

これは論理的に続きます。Pointはstd :: pairではありません。Pointからstd :: pairへの公開アップキャスト変換は望ましくありませんが、std :: pairの内部を使用する必要があります。

他の可能性は、has-a関係または構成です。各Pointは、内部で使用するプライベートstd :: pairを持っています。

実際には、構成とプライベート継承の間に大きな違いはありませんが、後者では、ポイントメンバ関数でstd :: pairに強制的にアップキャストできます。

独自のPointクラスをロールします。これにより、将来、さまざまなことを実行できるようになります。具体的には、この種の問題を以前に解決しましたが、有用であることがわかったのは、独自のPoint構造を定義し、それを継承するPointクラスを作成することです。

完全な開示:STLはあまり好きではありません。

std :: pairにはoperator <!> lt;があるため、std :: pairをパブリックに継承しないでください。ただし、Pointにはないはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top