我有一個基類Shape
和一些其他派生類,如Circle
,Rectangle
等。我想將兩個對象傳遞給函數getDistance(object1, object2)
來計算兩個對象之間的距離。以兩個對象作爲參數的函數
我的問題是,這個函數應該如何聲明和實現?你認爲我應該使用template
,因爲我可能會傳遞來自兩個不同類的兩個對象嗎?如果是這樣,template
將如何?
任何幫助表示讚賞
我有一個基類Shape
和一些其他派生類,如Circle
,Rectangle
等。我想將兩個對象傳遞給函數getDistance(object1, object2)
來計算兩個對象之間的距離。以兩個對象作爲參數的函數
我的問題是,這個函數應該如何聲明和實現?你認爲我應該使用template
,因爲我可能會傳遞來自兩個不同類的兩個對象嗎?如果是這樣,template
將如何?
任何幫助表示讚賞
通常你會使用一個純虛的基類。你已經有了Shape的繼承,所以模板對於這個問題來說是矯枉過正的。
添加虛擬爲getPosition()到您的基本形狀類並進行getDistance的()取兩個形指針(或引用)。例如:
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是正確的 - 在良好的措施基類添加的虛擬析構函數。 ;)
你可以用模板做:
template<class S, class T> getDistance(const S& object1, const T& object2) {
只要兩個對象具有相同的功能或變量(即x和y)來計算距離。只要Shape類迫使像功能爲getPosition
getDistance(const Shape& object1, const Shape& object2)
:
getPosition() = 0; (in Shape)
我建議繼承,因爲這將是更清潔和更容易理解和
否則,你可以使用繼承控制錯誤,代價是一小部分速度。
另一種選擇是使用參數多態:
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());
}
哇,那是異想天開。我的課程與您發佈的內容略有不同,但您的觀點讓我領悟到了解決方案。謝謝Scotty :) – 2012-07-23 06:06:54
@JackintheBox:不客氣。你可以點擊接受我的答案嗎? :) – Scotty 2012-07-23 06:52:13
'Shape'類應該有虛擬析構函數。 – 2012-07-23 06:55:54