我在很久沒有回到C++了,而且我對於我對相當熟知的靜態初始化問題的理解有點磕磕絆絆。C++靜態常量和初始化(有沒有一個失敗)
比方說,我有一個簡單的類Vector2下面給出(請注意,我知道,X和Y應該是私人的getter和setter方法,這些都只是爲了簡潔,省略):
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {};
float x,y;
}
現在,如果我想指定一個靜態const成員來表示一個Vector2,其中x和y設置爲1,我不確定如何繼續 - 靜態常量成員是否會陷入靜態初始化問題或將它們設置爲常量均值的行爲他們都還好?我有以下幾種可能醞釀:
可能性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);
可能性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;
}
可能性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;
}
現在,我的首選方式來寫這個就像在可能性2中一樣,只是因爲它對我來說是一種更舒適的語法。但是,如果我從另一個類的另一個靜態方法調用getOne()方法,我會冒險崩潰和燃燒?正如我所說,這是因爲我使用的是靜態常量而不是普通靜態,因此我提出了這個問題,因爲我在純靜態類成員問題上發現了很多,但對常量靜態問題沒有任何幫助。
我懷疑我沒有得到任何東西,因爲我使用的是靜態常量,並且需要與Possibility 3一起才能安全,但我只是想問一下,如果有人能爲我解釋這一點。
我意識到我可能會打開自己的鏈接指向我正在問什麼,但我看過,發現之前沒有找到。
任何幫助將不勝感激。
從你的問題來看,這並不完全清楚,但如果你試圖從另一個靜態初始化方法*直接訪問靜態成員,那麼你只有**傾向於失敗。在調用main()之後,從另一個函數訪問它是否爲static – sbk
感謝您的評論sbk。我的問題應該更清楚一些。我的目的是爲了確保靜態成員可以被其他類中的靜態初始化器在另一個cpp文件中使用。雖然我的其他類目前都沒有專門使用Vector2 :: getOne()來初始化另一個靜態成員,但確實存在一些靜態初始化器的鏈。我選擇Vector2作爲一個簡單的例子,所以我可以從這裏的評論中理解在整個項目中推出的最佳模式。非常感謝評論。 –