Sto tornando in C++ dopo una lunga assenza e sto inciampando un po 'sulla mia comprensione del problema di inizializzazione statica abbastanza noto.Costing e inizializzazione C++ (c'è un fiasco)
Diciamo che ho una semplice classe Vector2 come indicato di seguito (notare che io sono consapevole che xey devono essere privato con getter e setter, questi sono appena stati omessi per brevità):
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {};
float x,y;
}
Ora , se voglio specificare un membro const statico per rappresentare un Vector2 con x e y impostato su 1, non sono sicuro su come procedere - i membri const statici non rispondono al problema di inizializzazione statica o l'atto di renderli const significa Loro sono ok? Sto giocando con l'seguenti possibilità:
Possibilità 1:
// .h
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {}
static const Vector2 ONE;
float x,y;
};
// .cpp
const Vector2 Vector2::ONE = Vector2(1.f, 1.f);
Possibilità 2:
// .h
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {}
static const Vector2& getOne();
float x,y;
private:
static const Vector2 ONE;
};
// .cpp
const Vector2 Vector2::ONE = Vector2(1.f, 1.f);
static const Vector2& Vector2::getOne() {
return ONE;
}
Possibilità 3:
// .h
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {}
static const Vector2& getOne();
float x,y;
};
// .cpp
const Vector2& Vector2::getOne() {
static Vector2 one(1.f,1.f);
return one;
}
Ora, il mio modo preferito di scrivere questo sarebbe come nella possibilità 2, solo perché è una sintassi più comoda per me. Tuttavia, se chiamo il metodo getOne() da un altro metodo statico in un'altra classe, rischierò di andare in crash e di bruciare? Come ho detto, è perché sto usando un const statico piuttosto che un semplice statico che sto facendo questa domanda perché ho trovato molto sui problemi dei membri di una classe statica, ma nulla su problemi statici.
Ho il sospetto che non guadagno nulla dal fatto che sto usando const statico e che avrò bisogno di andare con la possibilità 3 per essere sicuro, ma voglio solo chiedere nel caso qualcuno possa far luce su questo per me.
Mi rendo conto che probabilmente mi sto aprendo a una serie di collegamenti che indicano esattamente quello che sto chiedendo, ma ho cercato e non ho trovato prima di postare questo.
Qualsiasi aiuto sarà apprezzato con gratitudine.
Non è completamente chiaro dalla tua domanda, ma sei ** solo ** incline alla cosa fiasco se provi ad accedere al membro statico da * un altro inizializzatore statico * direttamente o meno. Accedendo da un'altra funzione statica o meno, dopo che main() è stato chiamato è OK – sbk
Grazie per il tuo commento sbk. Avrei dovuto essere un po 'più chiaro nella mia domanda. La mia intenzione era di assicurare che stavo per essere sicuro che il membro statico fosse usato da un inizializzatore statico in un'altra classe in un file cpp separato. Sebbene nessuna delle mie altre classi attualmente utilizzi Vector2 :: getOne() specificamente per inizializzare un altro membro statico, ho casi in cui esiste una catena di inizializzatori statici. Ho scelto Vector2 come un semplice esempio in modo da poter capire dai commenti qui il miglior schema da applicare all'intero progetto. Mille grazie per il commento. –