Digamos que tengo dos clases:

Class A {
  B b;
  Foo bar;
}

Class B {
// some stuff
}

Dado que un objeto de tipo A posee un objeto de tipo B, A. podría acceder a algunas cosas de B. ¿Cuál sería un buen diseño, si un objeto de tipo B tiene que tener acceso a su objeto propietario (de tipo A)? P.ej. si tengo un objeto de tipo B y quiero obtener el valor de barra del objeto del que es miembro.

¿Sería una buena práctica agregar una referencia a A a B cada vez que se crea una B o algún tipo de patrón de delegado?

2
Kackao 23 dic. 2016 a las 13:04

3 respuestas

La mejor respuesta

La forma normal sería usar un puntero principal en su clase B:

class A {
 A():b(this){}
 B b;
 Foo bar;
};

class B {
 B(A *parent=0)
 :p_parten(parent){}
 // some stuff
 void func(){
    if (p_parent)
      p_parent->bar.something();
 }
 A *p_parent;
};
1
user6556709 23 dic. 2016 a las 10:24

Si A depende de B y B depende de A al mismo tiempo, esto se llama dependencia circular. Indica un mal diseño, pero como he experimentado, a veces no se puede evitar.

Si se trata de una versión minimizada de algo que usará en un gran proyecto, le aconsejaría que piense por qué B necesita A, ya que A parece su clase de gerente. Y mover esa parte compartida de A a una clase separada, llamémosla C que pasar C a B en lugar de A.

Si tiene problemas de inclusión, utilice la "declaración directa" para declarar A en el archivo de encabezado de B.

0
Kadir Erdem Demir 23 dic. 2016 a las 10:39

Sí, simplemente quiere pasar una referencia o puntero a A en el constructor de B.

0
Paul Evans 23 dic. 2016 a las 10:20