"contenedor de objetos" y punteros [cerrado]

En primer lugar, me gustaría mostrar algo de código, tal vez ayude.

CBank *Bank;

COkno Okno(Bank);
CBohater Bohater(Bank);
CKlawiatura Klawiatura(Bank);
CWszystkiePlatformy WszystkiePlatformy(Bank);
Bank = new CBank(&Okno, &Bohater, &Klawiatura, &WszystkiePlatformy);

La idea principal es colocar todas las clases anteriores con la excepción de CBank, que las agrupará, y luego permitir que las clases agrupadas accedan entre sí. No sé si lo estoy haciendo bien. Al probar, el código sobre el puntero en las clases COkno ... etc. está desactualizado y no almacena los datos correctos.

preguntado el 11 de junio de 12 a las 19:06

Debe aclarar el problema que realmente está tratando de resolver y hacer una pregunta específica al respecto. -

2 Respuestas

Está almacenando punteros a objetos que tienen una duración de almacenamiento automático (al menos, puede ser difícil saberlo por la forma en que se publica su ejemplo). Cuando les dejan sus punteros de alcance actuales, se vuelven inválidos.

A continuación, pasas Bank, un puntero a un CBank objetar a cada uno de ellos, pero lo hace antes de que se inicialice. Se hace una copia y, cuando Bank se inicializa más tarde, se establece en un nuevo valor, pero sus otros objetos todavía tienen una copia de un puntero no válido dando vueltas. Mala idea.

Tienes una extraña dependencia aquí. Tu necesitas un CBank puntero para pasar a estos tres constructores, pero al mismo tiempo necesita esos tres objetos para pasar al CBank constructor. La dependencia es circular y este es un diseño pobre.

lo que puedes hacer es cambiar CBank para construir estos objetos internamente. Si no hay necesidad de asignación de memoria dinámica... bueno, no la use. Si es necesario entonces new subir los objetos dentro CBank ó en CBank's constructor y desasignarlos en el destructor (no olvide adherirse a las regla de tres ¡Si haces esto!).

Pregúntese; son estas dependencias democracia ¿necesario? ¿Puedes simplificar esta relación?

Respondido el 11 de junio de 12 a las 19:06

Una versión simplificada sería tener 2 objetos que intentan referirse entre sí:

class A {
    A(A* other);
};

A* one = new A(two); // ?
A* two = new A(one);

(Aquí hay una clase, tienes diferentes clases, esto realmente no importa).

Esto obviamente no funciona porque one no puedo referirme two antes two es creado.

Me temo que no hay una forma razonable de hacer esto que no sea la inicialización en dos fases. Los objetos deben crearse en algo camino y uno de ellos necesita reconocer que el segundo aún no existe.

De ahí algo como:

class A {
    A(A* other);
    A();
    // ...
};

A* one = new A();
B* two = new A(one);
one->setOtherReference(two);

Sí, esto implica una inicialización en dos fases, es decir, hay un momento en que one se crea pero aún no se ha inicializado por completo (esperando setOtherReference() que requiere para funcionar).

Por cierto: ¡Lo más probable es que puedas simplificar tu diseño para evitar esto!

Respondido el 11 de junio de 12 a las 19:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.