Frage

Ich verstehe, dass der folgende Code würde Segmentierungsfehler führen, da bei der cstr von A, B :: SYMBOL wurde noch nicht initialisiert. Aber warum?

In der Realität ist ein ein Objekt, das als Karte dient, dass die Symbole von Klassen wie B-Pläne an ihre jeweiligen IDs. C hält, um diese Karte (A) Statisch-ly, so dass er die Zuordnung als eine Klasse-Funktion bereitstellen kann.

Die primäre Funktion von A ist als eine Karte für C zu dienen, die sich beim Start initialisiert. Wie soll ich in der Lage sein, dass Fehler ohne Segmentierung zu tun, vorausgesetzt, dass ich immer noch B :: ID und B :: SYMBOL im Code (kein #define pls) verwenden kann?

(ps. Gehe ich davon umgesetzt haben, die umfassen Wächter)

//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)
    {
    }
War es hilfreich?

Lösung

Verwenden Sie verzögerte Initialisierung von s_A. Dies könnte funktionieren:

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

Oder:

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;

Weder Lösung ist Thread-sicher.

Andere Tipps

Was Segmentierungsfehler reden Sie? Ihr Code einfach nicht kompilieren, weil Mitglieder der B (und B selbst) nicht erklärt vor A::A(). Der Compiler einfach nicht wissen, was B ist.

Wenn Sie die Definitionen von A und B austauschen, dann sollte der Code kompiliert und funktionieren. Wie solange alles in derselben Übersetzungseinheit ist, sollte es keine Probleme mit der Initialisierungsreihenfolge sein, vorausgesetzt, dass die Definitionen von statischen Mitgliedern B precede die Definition von C::s_A. definierte Objekte in derselben Übersetzungseinheit sind in der Reihenfolge ihrer Definition initialisiert, was bedeutet, dass bereits initialisiert durch die Zeit A::A() beginnt, statische Mitglieder B werden. Es gibt kein Potenzial für die Segmentierungsfehler in diesem Fall dargestellt.

Wenn Sie einen Segmentierungsfehler bekommen, müssen Sie etwas anders tun. Reihenfolge der Definition ist anders? vielleicht mehrere Übersetzungseinheiten? Post / beschreibt den echten Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top