estoy tratando de obtener el derecho siguiente configuración:Cómo hacer cumplir una orden de llamar a los destructores
una aplicación dada (con múltiples archivos fuente, unidades de compilación) tiene variables globales de tipo class A
definido de muchas unidades de compilación. Estos deberían ser "administrados" por un nuevo para introducir class B
(donde solo debería existir 1 instancia) en el sentido de que al crearse ellos mismos "se registran" en la clase B y en la destrucción "cerrar sesión".
Configurar las cosas para que los constructores funcionen es bastante directo. Uno puede usar:
types.h
:
class B {
static B& Instance() {
static B singleton;
return singleton;
}
void registerA(const A& a) {
// whatever
}
};
class A {
A() { B::Instance().registerA(this); }
};
Como llegar a los destructores ¿verdad? Si se utiliza:
class A {
A() { B::Instance().registerA(this); }
~A() { B::Instance().signoffA(this); }
};
continuación, el destructor de B
puede ser llamado antes de que el destructor de A
. Luego, la instancia de la clase A
cierra la sesión en una instancia recién creada de B
.
El caso de prueba sería una configuración multi fuente de archivo con las definiciones de los casos de class A
en un espacio de nombres:
file1.cc
#include "types.h"
namespace C {
A a;
}
file2.cc
#include "types.h"
namespace C {
A b;
}
supongo que el puede hacer tales cosa fácil con los indicadores inteligentes Boost. Sin embargo, si es posible, me gustaría evitar el uso de bibliotecas adicionales para mantener la dependencia lo más bajo posible.
Una cosa que podría ayudar: Todas las variables globales están en un espacio de nombres nombrado.
Corrija la sangría y el alcance. –
Además, considere la creación de un breve caso de prueba coherente para ilustrar dónde se crea su instancia 'A' en relación con todo lo demás. Es un poco confuso actualmente. –
Tenga en cuenta que 'register' es una palabra clave en C++ y C, y por lo tanto su código no se compila. –