2014-02-18 5 views
0

이중 디스패치를 ​​사용하여 다른 클래스 (A)의 하위 클래스 인 2 클래스 (B, C)의 2 개 개체 사이의 거리를 구합니다. class A의 메소드는 순수 가상이어야한다고 생각하지만 class A은 인스턴스화 가능해야하므로 순수 가상으로 만들 수 없습니까?이중 디스패치 무한 루프

또 다른 한가지는 기본 클래스에서 Distance(A *a)의 정의에서 무한 루프를 생성하기 때문에 좋은 방법으로 이중 디스패치를 ​​사용하는지 잘 모르겠다는 것입니다. class C에서

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); } 

:

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 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 :: 거리 (A * a) {돌아 가기 a-> 거리 (this);}'는 의심스러워 보입니다. – laune

답변

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

class A에서

, 나는 방법을 이 :

A* a1, a2; 

그리고 전화 :

a1->Distance(a2); 

전술 구현이 호출 어떤

a2->Distance(a1); 

를 호출합니다 :

a1->Distance(a2); 

을 ... 그리고 그 무한의 고리. A 이후

0

추상적 인 순수하지 않습니다, 당신은 또한 제공해야합니다 :

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); }