Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 实例化对象时的无限递归_Oop_Recursion - Fatal编程技术网

Oop 实例化对象时的无限递归

Oop 实例化对象时的无限递归,oop,recursion,Oop,Recursion,我有两个班,A班和B班 类A具有类B对象的ArrayList 每个B类对象都有一个存储a类对象的属性 因此,当我创建一个类a对象时,它填充对象类B的ArrayList。每个对象类B创建一个对象类a(与正在填充的对象类相同),它创建对象类B的ArrayList。。。等等 如何避免这种无限递归?这应该修复无限递归:(假设为Java) A类{ private ArrayList list=new ArrayList(); A(){ while(某些条件){ 增加(新B(本)); } } } B类{ 私

我有两个班,A班和B班

类A具有类B对象的ArrayList

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

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


如何避免这种无限递归?

这应该修复无限递归:(假设为Java)

A类{
private ArrayList list=new ArrayList();
A(){
while(某些条件){
增加(新B(本));
}
}
}
B类{
私有属性;
B(A inRef){
属性=inRef;
}
}

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

我认为,您误解了类(as type)和对象之间的区别

…因此,当我创建一个类a对象时,它填充对象类B的ArrayList。每个对象类B创建一个对象类a(与正在填充的对象类相同)。
--与对象不完全相同,但与类相同。每个对象
B
存储类
A
的对象。 一旦创建了对象
A
is,它可能就不是像
A->B->A
那样的同一个对象了

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

<>在C++中,这个技巧是相当常见的。

显示如何“填充对象类B的数组列表”和“创建对象类A”将是有用的。我假设它在这些类的构造函数中完成。
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;
  }
}