Pregunta

Yo entiendo que el código de abajo resultaría fallo de segmentación porque en el CSTR de A, B :: SÍMBOLO no fue inicializado todavía. Pero ¿por qué?

En realidad, A es un objeto que sirve como un mapa que mapea los símbolos de las clases B como a sus respectivas identificaciones. C ejerce en este mapa (A) estática-ly tal que puede proporcionar el mapeo como una función de la clase.

La función principal de A es servir como un mapa para C que se inicializa en el arranque. ¿Cómo debería ser capaz de hacer eso sin fallo de segmentación, con tal de que todavía puedo usar B :: ID y B :: símbolo en el código (sin #define pls)?

(ps. Asume He implementado la incluyen guardias)

//A.h
    #include "B.h"
    class A
    {
    public:
      A()
      {
        std::cout<<B::ID<<std::endl;
        std::cout<<B::SYMBOL<<std::endl;
      }
    };

//B.h    
    class B
    {
    public:
      static const int ID;
      static const std::string SYMBOL;
    }

//B.cpp    
    #include "B.h"
    const int B::ID = 1;
    const std::string B::SYMBOL = "B";

//C.h    
    #include "A.h"
    class C
    {
    public:
      static A s_A;
    };

//C.cpp    
    #include "C.h"
    A C::s_A;

//main.cpp    
    #include "C.h"
    int main(int c, char** p)
    {
    }
¿Fue útil?

Solución

El uso de inicialización perezosa S_A. Este trabajo podría:

class C
{
public:
  static A& getA() { static A s_A; return s_A; }
};

O:

class C
{
public:
  static A& getA() 
  { 
    if( ps_A == NULL) ps_A = new ps_A; 
    return *ps_A; 
  }
private:
  static A* ps_A;
};

A* C::ps_A = NULL;

Ni solución es segura hilo.

Otros consejos

¿Qué fallo de segmentación que estas hablando? Su código simplemente no se compilará, porque los miembros de B (y B sí mismo) no son declararon antes A::A(). El compilador simplemente no sabrá lo que es B.

Si intercambia las definiciones de A y B, a continuación, el código debe compilar y funcionan bien. Como siempre y cuando todo está en la misma unidad de traducción, no debería haber ningún problema con el orden de inicialización, en el supuesto de que el Definiciones de los miembros estáticos de preceder B el Definición de C::s_A. Objetos definidos en la misma unidad de traducción se inicializan en el orden de su definición, lo que significa que por el momento se inicia A::A(), miembros estáticos de B ya se inicializan. No hay posibilidad de que el fallo de segmentación en este caso, tal como se presenta.

Si usted está recibiendo un fallo de segmentación, que debe estar haciendo algo diferente. Orden de la definición es diferente? múltiples unidades de traducción tal vez? Poste / describir el código real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top