2014-02-18 4 views
0

Я использую двойную отправку, чтобы получить расстояние между 2 объектами из 2 классов (B, C), которые являются подклассами другого (A). Я думаю, что методы в 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); } 
Смежные вопросы