6

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

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

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

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

だから、私の質問は、私のポイントクラスを作るために、私はすべきかということです

  • std :: pairから公に派生し、自分のメンバー関数を追加しますか?私のコードはすべて同じままでいられるので、これは素晴らしいことです。私はそのようなstd::pair<double, double>* p = new Point;ことをするつもりはないので、仮想デストラクタのようなことを心配する必要はありません。
  • std :: pairの機能を複製しているので面倒な、自分のPointクラスをロールしますが、「純粋な方法で実行しています」。
  • std :: pair用にoperator+とoperator-のテンプレートを特殊化します。これは、ソースファイルとヘッダーファイルのどちらに含まれるかを確かに覚えていません。

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

4

8 に答える 8

14

独自のPointクラスをロールすることもできますが、データを格納するために内部でstd::pairを使用します。これにより、STLの問題からの継承が防止されますが、std::pairの機能は引き続き使用されます。

于 2009-04-30T22:08:24.797 に答える
2

std :: pairの機能を使用する場合は、独自のPointクラスを作成し、プライベート継承または構成のいずれかを使用することに賛成です。typedefの問題は(ご存知のとおり)、Pointを受け取る関数は、std :: pair <double、double>として表されるものでも使用できることですが、これは無効な場合があります。

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

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

(関数名の方が良いかもしれません)。

于 2009-04-30T22:25:28.060 に答える
2

自分で作成するよりも優れています。既存の無料のVector/Pointライブラリを入手してください。1つの推奨事項:ゲームプログラマーのためのEssentialMathに添付されているもの。見つけたライブラリを出発点として使用し、そこから最適化/特殊化/微調整することができます。

于 2009-04-30T22:19:04.833 に答える
1

もう1つのオプションは、自分でPointクラスを作成し、そのクラスでポイント座標を表すstd::pairを「所有」することです。

多くの場合、「ISA」(継承)関係よりも「HASA」(構成)関係の方が望ましいです。

于 2009-04-30T22:09:38.800 に答える
1

「ベストプラクティス」はあなた自身のポイントクラスをロールすることを言うだろうと思います。このようにして、将来的に3Dをはるかに簡単にすることができます。

于 2009-04-30T22:09:41.093 に答える
1

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

これは論理的に次のようになります。Pointはstd::pairではありません。Pointからstd::pairへのパブリックアップキャスト変換は必要ありませんが、std::pairの内部を使用する必要があります。

他の可能性は、持っていることです-関係、または構成:各ポイントは持っています-それが内部で使用するプライベートstd::pair。

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

于 2009-04-30T22:12:16.313 に答える
0

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

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

于 2009-04-30T22:14:29.197 に答える
0

std :: pairには演算子<がありますが、Pointには演算子<がないため、std::pairから公に継承しないでください。

于 2012-01-24T12:26:11.260 に答える