2

基本クラスと、 などのShape他の派生クラスがあります。2つのオブジェクト間の距離を計算する関数に 2 つのオブジェクトを渡したいと思います。CircleRectanglegetDistance(object1, object2)

私の質問は、この関数をどのように宣言して実装する必要があるかということです。template2 つの異なるクラスから 2 つのオブジェクトを渡す可能性があるため、使用する必要があると思いますか? もしそうなら、どのようにtemplate見えますか?

どんな助けでも大歓迎です

4

3 に答える 3

4

通常、基本クラスで純粋仮想を使用します。すでに Shape からの継承があるため、この問題に対してテンプレートは過剰です。

仮想 GetPosition()を基本 Shape クラスに追加し、 getDistance() が 2 つのShape ポインター(または参照) を取るようにします。例えば:

class Shape
{
public:
    ~virtual Shape() {}  // Make sure you have a virtual destructor on base

    // Assuming you have a Position struct/class
    virtual Position GetPosition() const = 0;
};

class Circle : public Shape
{
public:
    virtual Position GetPosition() const;  // Implemented elsewhere
};

class Rectangle : public Shape
{
public:
    virtual Position GetPosition() const;  // Implemented elsewhere
};

float getDistance(const Shape& one, const Shape& Two)
{
    // Calculate distance here by calling one.GetPosition() etc
}

// And to use it...
Circle circle;
Rectangle rectangle;
getDistance(circle, rectangle);

編集: Pawel Zubrycki は正しいです - 適切な測定のために基本クラスに仮想デストラクタを追加しました。;)

于 2012-07-23T05:02:30.463 に答える
1

テンプレートでそれを行うことができます:

template<class S, class T> getDistance(const S& object1, const T& object2) {

距離を計算するために、両方のオブジェクトが同じ関数または変数 (つまり、x と y) を持っている限り。

それ以外の場合は、継承を使用できます。

getDistance(const Shape& object1, const Shape& object2)

Shape クラスが getPosition のような関数を強制する限り:

getPosition() = 0; (in Shape)

わずかな速度を犠牲にして、エラーを理解し、制御することがよりクリーンで簡単になるため、継承をお勧めします。

于 2012-07-23T05:05:01.020 に答える
0

もう 1 つのオプションは、パラメトリック ポリモーフィズムを使用することです。

struct Position {
    float x, y;
};

class Circle {
public:
    Position GetPosition() const;  // Implemented elsewhere
};

class Rectangle {
public:
    Position GetPosition() const;  // Implemented elsewhere
};

float getDistance(const Position &oneP, const Position twoP); // Implemented elsewhere

template<class K, class U>
float getDistance(const K& one, const U& two) {
    return getDistance(one.GetPosition(), two.GetPosition());
}
于 2012-07-23T07:46:53.160 に答える