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_Class_Class Design - Fatal编程技术网

Oop 从其他类实例访问类实例

Oop 从其他类实例访问类实例,oop,class,class-design,Oop,Class,Class Design,我有4门课:A、B、C和D A实际上是一个主类,有B、C和D的实例: class A() { var B_class : B = new B() var C_class : C = new C() var D_class : D = new D() } D类具有使用C类中的方法的方法。但是这些方法需要知道C类的状态 所以我的理解是,在构造D类时,我需要将C类作为参数传入,如下所示: class A() { var B_class : B = new B() var C

我有4门课:A、B、C和D

A实际上是一个主类,有B、C和D的实例:

class A() {

  var B_class : B = new B()
  var C_class : C = new C()
  var D_class : D = new D()

}
D类具有使用C类中的方法的方法。但是这些方法需要知道C类的状态

所以我的理解是,在构造D类时,我需要将C类作为参数传入,如下所示:

class A() {

  var B_class : B = new B()
  var C_class : C = new C()
  var D_class : D = new D(C_class)

}
但另一个问题是C_类还需要使用来自D_类的方法来更改D_类的状态。如果所有的东西都在一节课上,那就容易了


当然,我可以只使用接受特定类的方法,但必须有更好的方法。我确信我在设计中忽略了一些基本的东西。

我不确定这是否适用于您的OO语言,但在中,您可以很容易地让
C_类
包含对
D
的引用和
D_类
C
的引用:

class C;
class D;

class C
{
  D & otherD;

public:
  C(D & d) : otherD(d) { }
};

class D
{
  C & otherC;

public:
  D(C & c) : otherC(c) { }
};

class A
{
  C myC;
  D myD;

public:
  A() : myC(myD), myD(myC) { }
};

关键是可以有指向不完整类型的指针和引用。由于您不需要实际的相互嵌套的成员(这无论如何都没有意义),而只需要引用,因此可以很容易地使用这样的循环引用。

您可以向C添加一个SetD方法,或者您需要C来构造D,而D来构造C,这是不可能实现的。如果不是显式的SetD,那么将D作为参数传递给需要D的方法的C的方法可能会起作用。

是的,传递一个引用会起作用-真的想避免这种情况。另一种方法是:让C通过将自身作为引用传递来创建D:
C:D=newd(this)
D:constructor(C:C)