Domanda

Mi rendo conto che il codice qui sotto comporterebbe errore di segmentazione perché al CSTR di A, B :: SIMBOLO non era ancora inizializzato. Ma perché?

In realtà, A è un oggetto che serve come una mappa che mappa i simboli di classi come B ai rispettivi ID. C detiene questa mappa (A) statica-ly tale che esso può fornire la mappatura come una funzione di classe.

La funzione principale di A è di servire come una mappa per C che si inizializza all'avvio. Come dovrei essere in grado di farlo senza errore di segmentazione, a condizione che posso ancora usare B :: ID e B :: SIMBOLO nel codice (senza #define pls)?

(ps. Assumere Ho implementato il comprendono guardie)

//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)
    {
    }
È stato utile?

Soluzione

L'uso di inizializzazione pigra di S_A. Questo lavoro potrebbe:

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;

Né soluzione è thread-safe.

Altri suggerimenti

Che colpa di segmentazione stai parlando? Il tuo codice semplicemente non compilare, perché i membri di B (e B stesso) non sono ha dichiarato prima A::A(). Il compilatore semplicemente non sa che cosa è B.

Se si scambiano le definizioni di A e B, quindi il codice dovrebbe compilare e fine lavoro. Come fino a quando tutto è nella stessa unità di traduzione, non ci dovrebbe essere problemi con l'ordine di inizializzazione, supponendo che il Definizioni di membri statici B precedere il definizione di C::s_A. Oggetti definiti nella stessa unità di traduzione sono inizializzate nell'ordine della loro definizione, il che significa che inizia A::A() tempo, membri statici B sono già inizializzati. Non c'è potenziale per l'errore di segmentazione in questo caso come presentato.

Se hai trovato un errore di segmentazione, si deve fare qualcosa di diverso. Ordine di definizione è diversa? Più unità di traduzione forse? Post / descrivere il codice vero e proprio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top