2011-03-31 19 views
2

我有一個config.h文件和一堆常量。 在main.cpp中,它將其中一個常量設置爲某個值,然後在util.cpp中調用一個函數。C++:文件之間不存在靜態變量

util.cpp也包含config.h,但由main.cpp設置的變量不具有相同的值。

代碼:

的config.h:

static int MAX_NUMBER_OF_TRAINING_DATA = 1000; 

main.cpp中(主):

else if (strcmp(argv[i], "-mTrnData") == 0) 
      { 
       MAX_NUMBER_OF_TRAINING_DATA = atoi(argv[i + 1]); 
      cout << "Number of data sets to be generated: " << MAX_NUMBER_OF_TRAINING_DATA << "\n\n"; 
          // prints what I tell it 
      } 

和utils.cpp

cout << "Number of data sets generated: " << MAX_NUMBER_OF_TRAINING_DATA << "\n\n"; 
    // prints the default value (in this case, 1000) 

那麼,如何我是否修復這個問題,以便我可以擁有我的config.h文件在我的cpp文件中記住這些事件?

在Java中,您可以執行Config.NAME_OF_CONSTANT,因此,如果有一種方法可以在C++中執行此操作,那將是最大的。

我知道常量不應該改變,但是他們唯一一次改變的地方是在main()中讀取運行程序的參數時...在這之後它們不會改變。

+0

改變值的變量很難被認爲是*常量*。 – 2011-03-31 16:27:08

回答

14

每個翻譯單元都會收到自己的static數據副本。

驗證這個最簡單的方法是在兩個單元中打印MAX_NUMBER_OF_TRAINING_DATA的地址 - 它會不同。爲了避免它,在標題中聲明extern並在一個單元中定義它,例如在main.cpp中。

除此之外,擁有這樣的全局變量(其命名方案甚至表明我們正在討論常量!)是邪惡的。您可能會考慮重構代碼,例如,使用獲取器GetMaxNumberOfTrainingData()使值保持可用,同時將寫訪問權限限制爲單個單元。

+0

+1你的答案比我的更快,更好。 – 2011-03-31 15:08:34

+0

但是不使用getter和setter:在Java中,你可以做類似Config.NAME_OF_CONSTANT的事情,有沒有辦法在C++中做到這一點? 我稱它們爲常量,因爲除了改變它們的參數之外,它們在之後不會改變。 – NullVoxPopuli 2011-03-31 15:25:52

+0

@DerNalia沒有什麼能夠阻止你創建一個容器類來存儲你的靜態變量,但除非你使用setter和getter,否則你仍然會遇到同樣的問題。 – komiga 2011-03-31 15:33:02

4

頭文件中名稱空間範圍內的非const static變量幾乎肯定是一個錯誤。您將獲得包含該文件的每個 文件的變量實例。如果你想使用相同的變量 幾個不同的翻譯單位,聲明它extern(並沒有 初始化)的標題,然後把它定義(不 extern,雖然你也可以使用extern如果有 初始值設定項)。

1

根據定義,靜態變量具有「文件範圍」。因此,通過在頭文件中聲明它,每個包含它的.c文件都會得到自己的變量。他們沒有任何關係。

你應該通常不會在頭文件中聲明變量。如果您需要多個模塊中的變量,請將其聲明爲一個文件,並將其作爲extern添加到您需要的所有其他文件中。

0

從設計角度來看,您應該切換到ConfigurationOption對象。

每個班級將取決於該對象的實例來提供,你可以有不同的初始化程序:從一個文件,命令行,等...

更重要的是,你將避免全球變量!