Abrufen von Werten statischer Variablen const an einem Konstruktor einer statischen Variablen
-
27-09-2019 - |
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)
{
}
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.