2014-08-29 37 views
0

我正在開發一個自組織地圖程序。 對此,我正在嘗試創建一種可以集中所有可以設置的用戶/開發人員變量的方法。我一直在嘗試使用Config.h/.cpp文件,但我不確定這是否是正確/最好的方法。創建集中式變量文件

看來,如果我不以正確的方式把它放在編譯錯誤。

問題是集中化必須在編譯和運行之間更改的變量的最佳/正確方法?

的config.h

#ifndef CONFIG_H_ 
#define CONFIG_H_ 


class Config{ 

public: 


    static const std::string outputFileLocation;// 
    static const std::string inputFilename;// 
    static const std::string outputFileExt;// 

    unsigned int vectorLength = 3;//RGB 


    //VARIBLE USED IN SOM CLASS 
    static const int NODE_GRID_HEIGHT = 100; 
    static const int NODE_GRID_WIDTH = 100; 


}; 

#endif /* CONFIG_H_ */ 

Config.cpp

#include "Config.h" 

//location to store output soms at it is iterated through 
std::string Config::outputFileLocation = "/home/projectFiles/testMedia/results/mySom_"; 

//extension to put on output soms. 
std::string Config::outputFileExt = ".jpeg"; 

////starting rgb image file to proccess 
std::string Config::inputFilename = "/home/projectFiles/testMedia/yellowColor3.jpg"; 


////Length of muliti-dimensional data point. ie. a pixel. 
unsigned int Config::vectorLength = 3; 
+0

在C++中,我非常肯定你必須在聲明它們時立即定義'const'變量;你可能想放棄'.cpp'文件,只使用一個頭文件。你能提供關於你得到的編譯器錯誤的更多細節嗎? – 2014-08-29 19:16:34

+1

你的問題是什麼? – 2014-08-29 19:16:58

+0

問題是集中化必須在編譯和運行之間更改的變量的最佳/正確方法? – 2014-08-29 19:21:20

回答

1

這是保持在配置一個獨特的類的有效方法。因此,您將能夠爲默認配置定義構造函數,以及配置加載和保存方法。

但是,在您的代碼中存在較小的一致性問題。

如果聲明:

static const std::string outputFileLocation; // you said const 

那麼你應該把它定義爲一個常量:

const std::string Config::outputFileLocation = "/home/projectFiles/testMedia/results/mySom_"; 

相反,如果你定義了一個非靜態數據成員:

unsigned int vectorLength = 3; //You already intialise it here 

你不能像你那樣重新定義它。這只是靜態的必要條件。

但是,我想知道你爲什麼要製作const。這要求它們被初始化(或者像你一樣,如果它們是靜態的,或者作爲普通成員的構造函數的一部分)並且它們可能在之後不會改變。這可以防止您更改配置,例如在啓動時加載配置文件時。

更多的想法

一旦你有你的配置類,你可以很容易地決定哪些變量是固定在編譯,並應進行動態初始化。動態可能是:

  • 讀取配置文件(請參閱:此SO question)。

  • 打通系統環境中的某些變量(見getenv()

  • 系統的具體方法,但這種woudld不能移動的,因此應謹慎考慮(適用於Windows,它通常例如使用registry

  • 使用傳遞給main()的命令行參數。

0

我推斷您使用您的代碼來運行實驗,因爲您需要更改編譯和運行之間的變量值。我過去完成這項工作的一個簡單方法是將所有內容都集中在頭文件中的未命名名稱空間中。這樣,您可以刪除static聲明,並且只需要#include配置文件。

就是這樣。

Configs.h

#ifndef CONFIG_H_ 
#define CONFIG_H_ 

namespace{ 

    const std::string outputFileLocation = "something";// 
    const std::string inputFilename = "something";// 
    const std::string outputFileExt = "something";// 

    unsigned int vectorLength = 3;//RGB  

    //VARIBLE USED IN SOM CLASS 
    const int NODE_GRID_HEIGHT = 100; 
    const int NODE_GRID_WIDTH = 100; 

}; 
#endif 

注意這可能不是最好的解決辦法,但是是簡單而有效的。根據項目的目標,您可能需要考慮更優雅的解決方案。

另一個建議

假設我的演繹是正確的,從配置文本文件讀取這些值也將是一個不錯的選擇。您不需要在運行之間重新編譯,如果您有一個大型項目,這可能會非常耗時,而且許多其他文件依賴於單個配置。