2

基本的に、 と呼ばれる基本クラスと、Geometry、 などの派生クラスがあります...PointPolygon

Geometry次のようなメソッド交差を実装します。

Geometry* intersection(Geometry* other)
{
     Geometry* inter = compute_intersection(this, other); 

     if (inter is a polygon) 
         return new Polygon(inter);

    if (inter is a point) 
         return new Point(inter);
} 

プログラムで 2 つのジオメトリの交差を計算すると、 が得られ、それが実際に何であれそれを計算Geometry*できます。dynamic_cast

良いデザインですか?私が間違っていると思うのは、交差を計算し、結果を dynamic_cast するたびに実数型をチェックしなければならないことです (これは遅くなる可能性があります)。しかし、主な問題は、この設計では、Geometryその派生物 (ポイント、ポリラインなど) を知っている必要があることです。

これらの問題を回避するための良い解決策は何ですか?

4

5 に答える 5

0

おそらくあなたは使うことができますboost::variant

typedef boost::variant<Point, Polygon/*, and other...*/> Geometry_Variants;

Geometry_Variants intersection(Geometry_Variants const& other)
{
    // compute the intersection and return Point or Polygon
}
于 2012-04-25T10:11:07.667 に答える
0

私に関する限り、ここには2つの問題があります。

第一に、私は物事を取得/設定する関数をあまり気にしません。私はオブジェクトに私のために何かをするように指示することにもっと興味があります。

次に、複数のディスパッチ(この場合はダブルディスパッチ)を実装しようとしています。これは、必要な動作が複数のオブジェクトのタイプに依存する場合です。

カプセル化、カプセル化、カプセル化という私の通常のマントラは、次のアイデアに向かって私を導きます。

  • 交差点でやりたいことをカプセル化します。
    • その領域をスプレッドシートのセルに入れます
    • ジオメトリポイントをディスプレイリストに追加します
  • 別のタイプを指定して、あるタイプのディスパッチをカプセル化します
    • ビジターパターンを調べます
  • 交差点へのビヘイビアーの適用をカプセル化する
于 2012-04-25T09:05:29.107 に答える
0

あなたの問題は次の名前で知られています:multiple dispatchまたはmulti methods. 私の知る限り、C++ にはこの問題に対する適切な答えはありません。Andrei Alexandrescu によるこの問題の良い議論はここにあります:

http://books.google.fr/books?id=aJ1av7UFBPwC&pg=PA263&lpg=PA295&dq=modern+c%2B%2B+design+multiple+dispatch&source=bl&ots=YRdIZrWiaV&sig=2Vj0Blst_jmhMCAZIJ8gUiG_pl4&hl=fr&sa=X&ei=082XT86RHNS18QPW7f3mBQ&ved=0CCYQ6AEwAA#v= onepage&q&f=false

それだけの価値がある本を買うことをお勧めします。

于 2012-04-25T10:14:46.053 に答える
0

オブジェクトをコピーするために継承された型に従って new する必要がある場合は、オブジェクトのコピーを返す clone() 関数を実装することにより、仮想コピー コンストラクターを使用できます。

virtual Obj* Obj::clone() const { return new Obj(*this); }

これは、intersection() 関数から呼び出すことができます。

于 2012-04-25T08:21:01.307 に答える
0

返されたオブジェクトの新しいオブジェクトを作成する必要があるのはなぜですか?すぐに返せないのですか? それができない場合は、派生クラスごとに 1 つの追加メソッドを実装して、結果を新しいオブジェクトにラップし、incompute_intersectionの代わりにこの新しいメソッドを呼び出します。compute_intersectionGeometry

私の答えでは、可能な唯一の状況を想定してcompute_intersectionいます。抽象的であり、各派生クラスがそれを実装しています。

于 2012-04-25T07:48:11.437 に答える