私はクラスを持つデータモデルを使用しています: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;
};
コメントやご提案ありがとうございます。私は幾何学ライブラリを書いていて、最も適切なデータモデルについて考えています。