0

インターフェイスを作りたい

Coordinate

メソッドで

double distanceTo(Coordinate *otherCoord);

しかし、インターフェイスを実装するクラスに、それぞれのバージョンのdistanceTo.

たとえばGeographicCoordinate実装する場合Coordinateは、メソッドを強制的に実装する必要があります

double distanceTo(GeographicCoordinate *otherCoord);

むしろその後

double distanceTo(Coordinate *otherCoord);

これを表現する C++ の構文は何でしょうか?

4

2 に答える 2

1

不思議なことに繰り返されるテンプレート パターン (CRTP)が必要です

template<typename DerivedType>
class Coordinate{

    double distanceTo(DerivedType *otherCoord) = 0;

};

class GeographicCoordinate: public Coordinate<GeographicCoordinate>

ただし、これにより、各基本クラスが派生クラスに固有になり、これにはコストがかかりすぎる可能性があります (コンテナーに格納できないなど)。

double distanceTo(Coordinate *otherCoord);または、関連する関数を仮想化して、テンプレートを実行する必要をなくすことで、それで十分なようにすることもできます。

于 2013-01-06T01:43:01.530 に答える
0

これが実際に必要な場合もありますが、この問題を解決する一般的な方法は、基本クラスで仮想関数を使用することです。

したがって、たとえば:

// Example of how to describe a coordinate position - could be many other ways. 
struct PosType { double x; double y };

class Coordinate
{
 public:
    double distanceTo(Coordinate *otherCoord)
    {
        PosType position = getPosition();
        PosType otherPos = otherCoord->getPosition();
        ... use position and otherpos to calculate distance. 
    }
    virtual PosType getPosition() = 0; 
};


class GeographicCoordinate
{
  public:
   PosType getPosition() { return pos; }    

  private: 
   PosType pos; 
}

class SomeOtherCoordinate
{
  public:
   PosType getPosition() 
   { 
      PosType myPos = ... // perform some calculation/transformation. 
      return myPos; 
   }    
}

このようにして、タイプに関係なく、他の座標計算に対して任意の座標を実行できます。

もちろん、このソリューションが機能しない場合もありますが、一般的には機能するはずです。

于 2013-01-06T02:11:22.410 に答える