我有一个基类Shape
和一些其他派生类,如Circle
,Rectangle
等等。我想将两个对象传递给函数getDistance(object1, object2)
来计算两个对象之间的距离。
我的问题是,如何宣布和实施此功能?你认为我应该使用template
,因为我可以从两个不同的类中传递两个对象吗?如果是这样,template
将如何?
感谢任何帮助
答案 0 :(得分: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是正确的 - 在基类上添加了虚拟析构函数以获得良好的衡量标准。 ;)
答案 1 :(得分: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)
我建议继承,因为它会更清晰,更容易理解和控制错误,但代价是微不足道。
答案 2 :(得分: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());
}