2014-09-30 35 views
2

我需要實例化一個類中的許多對象,但它們中的每一個都需要知道對於此類的每個對象都通用的特定值X,例如全局參數。這是我的構造函數在我的對象中正常工作所必需的。如何在C++中的許多對象中使用公共值?

有沒有辦法做到這一點,而不作爲構造參數傳遞值?我想要做的是在所有對象中使用相同的變量,所以我不浪費RAM。

*在我的實際情況中,它不僅僅是一個X值,而是一個1024-dim的int向量。

+0

將該值通過引用傳遞給函數,而不是通過值傳遞,因此它不會創建額外的副本。 – CoryKramer 2014-09-30 23:26:28

+0

* 1024-dimmension int vector *認真? – deviantfan 2014-09-30 23:28:36

+0

全局變量有什麼問題?如果你不喜歡它們 - 靜態變量也會起作用 – 2014-09-30 23:30:08

回答

1

我假定你的意思是你想要一個大小爲1024的矢量作爲所有類的共享變量。你可以這樣做:

class MyClass { 

    static std::vector<int> s_my_vector; 
} 

這段代碼會進入你的頭文件。在你的cpp文件中,你必須初始化std :: vector。不過,我不建議這樣做。需要構造函數調用的類靜態變量(即不是基元或POD類型)有很多我不打算進入的陷阱。我將提供一個不過更好的解決方案:

class MyClass { 
    static std::vector<int> & GetMyVector() 
    { 
    static std::vector<int> my_vector; 
    static bool initialized = MyVectorInit(my_vector); 
    return my_vector; 
    } 

    static bool MyVectorInit(std::vector<int> & v) 
    { 
    v.resize(1024); 
    ... 
    } 
public: 
    MyClass() { 
    std::vector<int> & v = GetMyVector(); 
    ... 
    } 

    static void EarlyVectorInit() 
    { 
    GetMyVector(); 
    } 
} 

在這種情況下,靜態局部變量確保只會有my_vector的一個副本,您可以通過調用GetMyVector得到一個參考吧。此外,初始化的靜態布爾保證只創建一次,這意味着MyVectorInit只會被調用一次。你可以使用這種方法,以防你需要以一些不可能在構造函數中完成的非平凡方式填充你的向量。 我寫它的方式,你的矢量會在你第一次使用它時自動創建,這很方便。如果您想由於某種原因手動觸發創建,請致電EarlyVectorInit()。

+1

GetMyVector和相關函數應該是靜態的。 – 2014-10-01 00:25:03

+0

我認爲。讓它們變得靜態有什麼好處嗎?由於他們應該是私人的(哎呀,忘了公開),我很難想出它會如何改變。 – 2014-10-01 00:27:49

+1

他們爲什麼不應該是靜態的?他們不需要任何物體存在。 – 2014-10-01 00:28:29

2

你想要的是一個靜態成員。 「當一個數據成員被聲明爲靜態時,只爲該類的所有對象維護一份數據副本」。例如

class myClass { 
    public: 
    static int x; 
}; 
相關問題