3

私はクラスを持つデータモデルを使用しています:Point2D、Point3D、PointGeo:

template <class T>
class Point2D
{
    protected:
            T x;
            T y;
...
};


template <class T>
class Point3D
{
    protected:
            T x;
            T y;
            T z;
...
};

template <class T>
class PointGeo
{
    protected:
            T lat;
            T lon;
...
};

これらのクラスのインスタンスを管理するために、ファイルからのポイントのロード、ポイントの追加/削除、リストのクリア、印刷を可能にする次のクラスが使用されます...

2Dポイントのリスト

template <class T>
struct TPoints2DList
{
    typedef std::vector <Point2D <T> > Type;
};


template <class T>
class Points2DList
{
    private:
            typename TPoints2DList <T>::Type  points;


    public:
            Points2DList() : points ( 0 ) {}
            virtual ~Points2DList() {points.clear();}
            Points2DList ( const Points2DList &source );
            typename TPoints2DList <T>::Type ::iterator begin() { return points.begin(); }
            typename TPoints2DList <T>::Type::const_iterator begin() const { return points.begin(); }
            typename TPoints2DList <T>::Type::iterator end() { return points.end(); }
            typename TPoints2DList <T>::Type::const_iterator end() const { return points.end(); }
            Point2D <T> &operator [] ( int index ) {return points[index];}
            const Point2D <T> &operator [] ( int index ) const {return points[index];}

    public:
            //Overloaded member functions
            inline void clear() {points.clear();};
            inline void pop_back() {points.pop_back();}
            inline void push_back ( Point2D <T> p ) { points.push_back ( p );}
            inline unsigned int size() const {return points.size();}

    public:
            //Other methods
            void loadPointsFromFile ( const char *file);
...
}

3Dポイントのリスト

template <class T>
struct TPoints3DList
{
    typedef std::vector <Point3D <T> > Type;
};


template <class T>
class Points3DList
{
    private:
            typename TPoints3DList <T>::Type  points;


    public:
            Points3DList() : points ( 0 ) {}
            virtual ~Points2DList() {points.clear();}
            Points3DList ( const Points3DList &source );
            typename TPoints3DList <T>::Type ::iterator begin() { return points.begin(); }
            typename TPoints3DList <T>::Type::const_iterator begin() const { return points.begin(); }
            typename TPoints3DList <T>::Type::iterator end() { return points.end(); }
            typename TPoints3DList <T>::Type::const_iterator end() const { return points.end(); }
            Point3D <T> &operator [] ( int index ) {return points[index];}
            const Point3D <T> &operator [] ( int index ) const {return points[index];}

    public:
            inline void clear() {points.clear();};
            inline void pop_back() {points.pop_back();}
            inline void push_back ( Point3D <T> p ) { points.push_back ( p );}
            inline unsigned int size() const {return points.size();}

    public:
            //Other methods
            void loadPointsFromFile ( const char *file);
 ...
}

PointGeoクラスのソースコードは似ています...

したがって、クラス間のコードの違いはわずかです。データの読み込み、印刷、保存の方法が異なります。

3つのクラスすべてを置き換えるクラスを設計することは不適切でしょうか?データ型に固有のデータをロード、印刷するためのメソッドを作成するにはどうすればよいですか?

同様の状況は、動的割り当て(Node2D、Node3D、...クラス)でも発生します。クラスNode2Dは、いくつかのトポロジ関係を格納し、他のノードまたは面へのポインタを使用します...このような場合、3つのクラスすべてに異なるデストラクタがあります...

2Dポイントのリスト

template <class T>
struct TNodes2DList
{
    typedef std::vector <Node2D <T> *> Type;
};

コメントやご提案ありがとうございます。私は幾何学ライブラリを書いていて、最も適切なデータモデルについて考えています。

4

2 に答える 2

4

I/O 操作を型に直接配置できPoint2D Point3Dます。印刷/読み取りは次のように簡単になるため、追加のリストクラスを作成する必要はありません。

for (std::vector<Point3D>::iterator i = a.begin; i != a.end(); ++i) {
    i->print_to_file(file);
}

これが実行できない場合は、少なくとも同じリスト クラスをテンプレートとして使用して、Point3D と Point2D の両方を提供できます。

于 2010-12-21T19:10:49.873 に答える
1

クラスで何をしているかに応じて、次のようなことができます。

template<class T, unsigned int count = 2>
class Point
{
public:
    T t[count];
    // other data members here
};

ただし、ベクトル演算 (外積、内積、正規化など) を行う場合、2 つのクラス (2D と 3D) を使用するよりもはるかに複雑になります。Geo クラスに特化したことをしていない限り、別の 2D および Geo 形式を持つ必要はまったくありません。

于 2010-12-21T18:58:18.757 に答える