【问题标题】:double dispatch infinite loop双调度无限循环
【发布时间】:2014-02-18 14:02:26
【问题描述】:

我正在使用双重调度来获取 2 个类(BC)的 2 个对象之间的距离,它们是另一个 (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*/ }

【问题讨论】:

  • 请在上面放草莓和樱桃,将代码格式化为代码。
  • 如果您描述触发无限循环的原因(显示您正在调用的方法以及如何调用,即使用哪些参数),这将对人们有所帮助。
  • double A::Distance(A *a) {return a-&gt;Distance(this);} 看起来很可疑。
  • 如果您可以使用 C++11,以下可能会有所帮助:ideone.com/8VxALs

标签: c++ pure-virtual virtual-functions double-dispatch


【解决方案1】:
virtual double Distance(A *a)
{return a->Distance(this);}

如果我有:

A* a1, a2;

我打电话给:

a1->Distance(a2);

上述实现会调用

a2->Distance(a1);

哪个会调用:

a1->Distance(a2);

...这是一个无限循环。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2021-01-02
      • 2019-02-09
      • 1970-01-01
      • 2016-07-11
      相关资源
      最近更新 更多