2010-11-16 103 views
1

我有一個類,它有一些靜態函數來執行一些計算。但是,在計算之前,我需要傳入一個數據來初始化一些靜態數據成員。目前我有一個init(數據)函數和一個clearResource()函數,應該在使用類之前和之後調用它。有沒有更好的方法來做到這一點?C++初始化類靜態數據成員

例如:

classA(){ 
static int a; 
static init(int b) { 
    a = b; 
} 
static functionA(){ 
    //perform something based on value of a; 
    switch(a){ 
    } 
} 

} 

int main(){ 
    classA::init(5); 
    classA::functionA(); 
} 

感謝

+0

靜態函數如何依賴於對象狀態? – yadab 2010-11-16 07:35:18

+1

一些代碼如何? – Chubsdad 2010-11-16 07:36:28

+0

目前還不清楚你是否想爲你的類的每個對象使用'init'和'clearResource',或者對所有對象只使用一次。 – 2010-11-16 07:40:39

回答

2

避免使用靜態成員函數:有你的構造函數初始化數據和析構函數清除資源(見RAII)。如果現有的類無法更改,請實現一個輔助類,該類從其構造函數調用init,並從其析構函數中調用clearResource

1

使成員函數和數據非靜態,在析構函數構造和免費資源初始化。這將保證正確的調用順序:初始化 - 執行操作 - 客戶端代碼中的免費資源。

+2

不,不確保唯一性並且不考慮Singleton模式。 – Puppy 2010-11-16 07:52:41

+0

有在試圖強制唯一性通常小了點,但在試圖引起許多問題......這不值得 – 2010-11-16 07:58:57

+0

@DeadMG:這是不可能的OP需要獨特性這個特殊情況,所以我刪除了對Singleton的引用。儘管如果沒有看到實際的(非示例)代碼,我不會那麼確定。 – vitaut 2010-11-16 08:02:47

2

您可以使用這種設計

class A() 
{ 
public: 
static int a; 
static void functionA(int arg = A::a) 
{ 
    if(A::a != arg) 
    A::a = arg; 
    ... 
} 
}; 

int A::a = 0; 
int main() 
{ 
A::functionA(); 
} 
+1

通過任何方式都不好,但滿足問題要求...如果將其設置爲要求,我會省略默認值。 – 2010-11-16 08:58:06

+0

如何在使用此解決方案之後釋放「a」,假設它是(類 - )對象而不是原始數據類型? – 2012-03-08 10:13:11

1

我會避免在這種情況下使用靜態成員。

這是你的問題。你有一個可以處理某些數據的類。無論出於何種原因,該數據都需要在該處理類的所有實例中共享。那好吧,我們有一個非靜態解決方案!

class Data : boost::noncopyable 
{ 
public: 
    Data() 
    { 
     // initialise all of our data. 
    }; // eo ctor 
}; // eo class Data 

你在哪裏實例化這個類是由你決定的。它可能是啓動時運行的應用程序類的成員,或者是某個根的一部分。它只需要可以訪問,不需要是靜態的,也不需要單身。

class DataProcessor 
{ 
private: 
    Data& m_Data; 

public: 
    DataProcessor(Data& _data) : m_Data(_data) 
    { 
    }; // eo ctor 
}; // eo class DataProcessor