2014-02-18 63 views
0

我使用雙派遣來獲得另一個(A)的子類的2個對象之間的距離(B,C)。 我認爲class A中的方法應該是純虛擬的,但是它們被用在其他地方的測試中,所以class A必須是可實例化的,所以我不能讓它們變成純虛擬的,對吧?雙派遣無限循環

另一件事是我不確定我是否以一種好的方式使用雙重調度,因爲有時會在基類的Distance(A *a)的定義中生成一個無限循環。

class A,我有方法:

virtual double Distance(A *a) {return a->Distance(this);} 
virtual double DistanceB(B *b) {return std::numeric_limits<double>::max();} 
virtual double DistanceB(C *c) {return std::numeric_limits<double>::max();} 
virtual double DistanceC(B *b) {return std::numeric_limits<double>::max();} 
virtual double DistanceC(C *c) {return std::numeric_limits<double>::max();} 

class B

double B::Distance(A *a) { return a->DistanceB(this); } 
double B::DistanceB(B *b) { /*calculate distance*/ } 
double B::DistanceC(C *c) { return c->DistanceB(this); } 

class C

double C::Distance(A *a) { return a->DistanceC(this); } 
double C::DistanceB(B *b) { /*calculate distance*/ } 
double C::DistanceC(C *c) { /*calculate distance*/ } 
+1

草莓和在頂部的櫻桃,格式代碼,代碼拜託。 – Angew

+3

如果你描述什麼會觸發無限循環(顯示你正在調用哪種方法,以及如何使用哪個參數),它將幫助人們。 – TypeIA

+0

'double A :: Distance(A * a){return a-> Distance(this);}'看起來很可疑。 – laune

回答

0
virtual double Distance(A *a) 
{return a->Distance(this);} 

所以,如果我有:

A* a1, a2; 

我呼籲:

a1->Distance(a2); 

上述實施將調用

a2->Distance(a1); 

它將調用:

a1->Distance(a2); 

...這是一個無限循環。

0

由於A不是純粹的抽象,你也必須提供:

virtual double DistanceA(A *a); 
virtual double DistanceA(B *b); 
virtual double DistanceA(C *c); 
virtual double DistanceB(A *a); 
virtual double DistanceC(A *a); 

和固定

double A::Distance(A *a) {return a->DistanceA(this); }