¿Por qué no se llamó al constructor c ++ cuando aparece como la variable miembro estática?

Tuve un problema extraño,

declarar una variable miembro estática cuyo nombre es clase B en la clase A. E inicializar en el archivo cpp. Pero el constructor de clase B nunca fue llamado. Intento usar una pequeña prueba, el constructor de la prueba podría llamarse normalmente. Por eso es muy extraño para nuestro sistema de producción.

El código como este, en hpp :

class Test { public: Test() { ofstream file("/tmp/wup.txt",ios::app); file << "wup in test" << endl; file.close(); } }; //## An extended personality class TsdNAExtPersonality : public TsdNAPersonality{ public: TsdNAExtPersonality( s_gg62_personRec * gg62Header, TsdNAFunctionType requiredFunctionType); private: static Test test; public: TsdNAExtPersonality( string * personalityFile, TsdNAFunctionType requiredFunctionType); }; 

Y en otro archivo cpp inicializo con

 Test TsdNAExtPersonality::test; 

Lo he intentado de varias maneras, pero encontré que todas las formas son inútiles.

  1. no estableció la variable como variable miembro, pero como variable global ==> tampoco se puede generar
  2. cambie la variable miembro como puntero y cambie la manera de inicializar usando new ==> no

El entorno es HP-UX, y la comstackción es aCC.

así que mi pregunta es:

  1. ¿Hay alguna opción de comstackción que influya en la variable? en otras palabras, no se inicializarán todas las variables estáticas.

  2. desde el estándar de C ++ se debe llamar cuando se cargó la biblioteca, ¿verdad?

  3. Puse otro valor int estático de la misma manera, se podría inicializar. Pero el constructor de la clase no se llama, muy extraño.

  4. ¿Hay algún error en mi código?

desde el estándar de C ++ se debe llamar cuando se cargó la biblioteca, ¿verdad?

No. Se garantiza que la inicialización dinámica de un objeto con duración de almacenamiento estático ocurrirá antes de la ejecución de cualquier función definida en la misma unidad de traducción. Si no hay tales funciones, o su progtwig nunca las llama, entonces no hay garantía de que alguna vez se inicialice.

Puse otro valor int estático de la misma manera, se podría inicializar. Pero el constructor de la clase no se llama, muy extraño.

Una variable int se inicializa de forma estática, antes de que se inicie el progtwig, siempre que su inicializador sea constante.

¿Hay alguna opción de comstackción que influya en la variable?

No que yo sepa, pero no estoy familiarizado con su plataforma. Podrías darte más control sobre la creación del objeto explorándolo dentro de una función:

 static Test & test() { static Test test; return test; } 

Ahora se garantiza que se inicializará la primera vez que se llame a la función. Por supuesto, deberás recordar llamarla en algún momento.

El inicio y el apagado de un progtwig de C ++ son áreas grises porque no está claro qué parte del código ya puede usar (porque se ha inicializado) y cuánto se está iniciando. Al cerrarse, ocurre lo mismo con el destructor … no está claro cuántos subsistemas se han cerrado cuando se destruyen las instancias estáticas.

Además, nunca debe usar la inicialización estática para cualquier cosa que pueda fallar, depurando antes del inicio o después del final de main puede ser muy difícil.

Tenga en cuenta también que el orden en que se inicializan las estadísticas no está definido (excepto en relación con otras estadísticas en la misma unidad de comstackción) y puede cambiar de una comstackción a la siguiente. Esto significa que puede vivir feliz con un progtwig en funcionamiento hasta que, por alguna extraña razón, obtenga un orden de inicialización diferente y las cosas dejen de funcionar sin ningún cambio relevante en el código.

El uso de la inicialización estática para cosas extremadamente simples está bien, para cualquier otra cosa no lo es, y debería hacer una inicialización controlada adecuada.

Creo que hay un error en tu comstackdor.

Ejecutar este código simple en linux / g ++ da los resultados esperados:

 #include  using namespace std; class A { public: A() { cout << "Hallo" << endl; } }; class B { public: static A a; }; AB::a; // < here the constructor must be called! int main() { cout << "Main runs" << endl; return 0; } 

Resultados en:

 Hallo Main runs 

El constructor DEBE ser llamado cuando se construya el miembro de datos estáticos (línea comentada arriba).

La inicialización estática en C ++ es:

  • Inicializacion cero
  • Inicialización constante
  • Inicializacion dinamica

Por lo tanto, su mejor apuesta es la inicialización en la primera llamada de función:

 int fn() { static int result = 42; return result; } 

EDITAR :

Si quieres inicializar antes de main:

 struct Initialize { Initialize() { fn(); } } Initialize initialize; 
    Intereting Posts