2

我有一个基类Shape和一些其他派生类,例如CircleRectangle等等。我想将两个对象传递给一个函数getDistance(object1, object2)来计算两个对象之间的距离。

我的问题是,这个函数应该如何声明和实现?你认为我应该使用template,因为我可能会传递来自两个不同类的两个对象吗?如果是这样,template外观会如何?

任何帮助表示赞赏

4

3 回答 3

4

通常你会在你的基类上使用一个纯虚拟。您已经从 Shape 继承,所以模板对于这个问题来说是多余的。

虚拟 GetPosition()添加到基本 Shape 类,并使 getDistance() 采用两个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

另一种选择是使用参数多态性:

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 回答