【问题标题】:Infinite recursion when instantiating object实例化对象时无限递归
【发布时间】:2012-11-19 07:04:25
【问题描述】:

我有两个班,A班和B班。

A 类有一个 B 类对象的 ArrayList。

每个 B 类对象都有一个存储 A 类对象的属性。

因此,当我创建 A 类对象时,它会填充 B 类对象的 ArrayList。每个对象 B 类都会创建一个对象 A 类(与正在填充的对象相同),它会创建一个 B 类对象的 ArrayList。 ..等等。

我应该怎么做才能避免这种无限递归?

【问题讨论】:

  • 展示如何“填充 B 类对象的 ArrayList”和“创建 A 类对象”会很有用。我假设它在这些类的构造函数中完成。

标签: oop recursion


【解决方案1】:

这应该可以修复无限递归:(假定为 Java)

Class A {

  private ArrayList<B> list = new ArrayList<B>();
  A(){ 
    while(someCondition) {
      list.add(new B(this));
    }
  }
}

Class B {

  private A attribute;
  B(A inRef){ 
    attribute = inRef;
  }
}

请注意,Battribute 字段不是使用 new 分配的,而是通过传入对 A 的引用来分配的。通过不使用new,我们不会创建A 类的新实例并避免递归。

【讨论】:

    【解决方案2】:

    我认为,您误解了类(作为类型)和对象之间的区别。

    ...So when I create a Class A object, it populates the ArrayList of objects Class B. Each object Class B creates an object Class A (same as the one that is being populated)... -- 不精确的 same 作为对象,但与类相同。每个对象B 存储类A 的对象。 并且一旦创建对象 A 可能与 A-&gt;B-&gt;A 不同。

    但是如果你想从对象B 引用父对象A,你可以使用引用(例如,你想使用它的公共方法等等)。所以在这种情况下,您不能在B 中创建对象A 的新实体,但是,当您创建对象B 时——在B 的构造函数中,您必须将其用作对父对象A 的参数引用.

    在 C++ 中,这个技巧相当普遍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2015-09-12
      • 2016-10-22
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多