6

コード内で 3D ポイントと 2D ポイントを明確に区別したいと考えています。明らかな解決策は、別々のクラスを持つことです。

一方、z = 0 の 3D ポイントから 2D ポイントへの変換は非常に一般的です。したがって、共通の基本クラスを使用して、これらの変換をメモリ内でインプレースで実行できるようにしたいと考えています。型を明確に区別するために、その基本クラスへの暗黙的な変換を禁止したいと思います。それは可能ですか?

または、このような同様の機能を持つさまざまなタイプを作成する別の方法がありますか?

4

4 に答える 4

2

これはあなたの質問に答えませんが、あなたの問題を解決するために、あなたは要求されたときに2Dポイントを返す3Dクラスのメソッドを作ることができます。

于 2013-03-18T12:38:04.340 に答える
2

子クラスを非公開で派生させることができます。

class PointBase {
  // ...
};

class Point2D : private PointBase {
  // ...
};

class Point3D : private PointBase {
  // ...
};

このアプローチの副作用は、 のパブリック メンバーにもPointBase外部からアクセスできないことです。そのため、サブクラスは、プロキシ メソッドを提供するか、キーワードで指定することにより、明示的にアクセスできるようにする必要がありますusing。そのため、一般的なロジックPointBaseが重要であり、それを 1 つの場所に実装することで前述の欠点よりも多くの利点が得られる場合にのみ、この方法を使用します。

于 2013-03-18T12:43:34.330 に答える
1

コピーせずに 3d ベクターの 2d 部分にアクセスしたい場合、適切な解決策は 1 つだけです。

class Vector2d { ... };
class Vector3d {
    Vector2d part2d;
    double z;
public:
    Vector2d& as2d() { return part2d; }
};

継承に基づく悪ふざけは、悪い設計、未定義の動作、またはその両方をもたらす可能性が非常に高いです。

于 2013-03-18T15:33:09.667 に答える
1

intポイントがベクトルとして保存されている場合、次元数を指定するパラメーターを使用して、3D および 2D ポイント クラスをテンプレート化されたクラスとして定義できます。

template<int dimensions> class Point {
    vector<int> coords;
    Point() : coords(dimensions) {}
    ....
    template<int other_dimensions> convertToPoint() const
    {
        // Handle different options here like:
        //   dimensions > other_dimensions
        //   dimensions < other_dimensions
        // et cetera
    }
};

そして、ポイント クラスをインスタンス化します。

typedef Point<2> Point2D;
typedef Point<3> Point3D;
Point2D pt = Point3D(1, 2, 3).convertToPoint<2>(); // Point2D(1, 2);
Point3D pt = Point2D(4, 5).convertToPoint<2>(); // Point3D(4, 5, 0);

このようにして、同じロジックを使用できますが、完全に異なる型と簡単な変換が得られます。言うまでもなく、2 つの別個のクラスではなく、1 つのクラスのみを定義する必要があります。

于 2013-03-18T13:03:51.023 に答える