2011-07-31 96 views
1

不是經驗豐富的C++程序員,我儘量保持程序可讀性。 可能的話,我將函數和類放在Main.cpp之外的其他cpp和頭文件中。關於代碼可讀性

我開始做同樣與所有的#define指令用於聲明標籤和基本參數。它們位於DEF_PARAM.h頭文件中,可以工作。

我想爲地圖做同樣的事情,但這會導致我的問題。

std::map <std::string,int> Mnemo_list; //Mapping of Mnemonics to number of parameters. 
Mnemo_list["P"]=4; 
Mnemo_list["PX"]=1; 
Mnemo_list["PY"]=1; 
Mnemo_list["PZ"]=1; 
Mnemo_list["SO"]=1; 
Mnemo_list["S"]=4; 
Mnemo_list["SX"]=2; 
Mnemo_list["SY"]=2; 
Mnemo_list["SZ"]=2; 
Mnemo_list["CpX"]=3; 
Mnemo_list["CpY"]=3; 
Mnemo_list["CpZ"]=3; 
Mnemo_list["CX"]=1; 
Mnemo_list["CY"]=1; 
Mnemo_list["CZ"]=1; 

因爲我有時用字符串從文本文件閱讀,我經常需要只用枚舉工作的開關控制,於是我開始跟在後面的開關使用整數的映射字符串。因爲地圖可能很長,所以我更喜歡它們將頭文件或頭文件放在頭文件或cpp文件中。

我試圖首先把完整塊(映射定義和分配)在頭文件,或僅在首部中的地圖DEF,其餘以CPP文件。其結果是從編譯如下奇怪的錯誤:

"error: expected constructor, destructor, or type conversion before '=' token" 

我認爲沒有人喜歡通過這樣一個在main.cpp中的開始了一系列的長列表進行瀏覽。一旦infor處於代碼中,您再也不想看到它,因此我會將這一系列代碼放入Main.cpp之外的頭文件或/和代碼文件中。

這種方法可以讓我想和全局變量的工作是什麼不是這樣的印象。我只是想避免這個問題,就像論壇之前向我提出的那樣。

這是很好的做法,還是有保持源代碼可讀的其他方式?

由於提前,

斯特凡

+0

幾十億人。它們中的許多是相互排斥的或不適用於給定的項目。幾乎所有的其他都是主觀的。 – delnan

+5

你能提供一些例子嗎?多餘的宏使用往往會使代碼無法讀取。此外,這個問題可能更適合[codereview.se]。 – hammar

+1

在編輯之後,我會推薦C++ 0x,即使在全局範圍內,您也可以使用正確的值初始化映射。 –

回答

1

眼前的問題是,雖然你可以有全局變量,你不能有全球代碼。也就是說,你可能沒有像Mnemo_list["P"]=4;這樣的代碼行,只是在函數外面漂浮。如果你想這樣初始化地圖,你必須把這些任務中的函數,這樣做

std::map <std::string,int> Mnemo_list = init_mnemo_list(); 

更一般地,使Mnemo_list一個全局變量可能不是最好的解決方案,但是無論你如何實現它,把它(和它的初始化器)放在一個單獨的源文件(cpp)中,並在頭文件中聲明它是一個很好的方法。

+2

變量可以做成const,沒有太多的麻煩。 – Puppy

0

Beta的答案的替代方案。考慮使用單例方法。與init_mnemo_list()的方法相反,對於函數的每次調用,映射都會創建一次而不是一次。此外,地圖是在一個地方定義的。

class cMySingleton 
{ 
public: 

    static const std::map<string, int> & get(void) 
    { 
    return m_pSingleton.m_map; 
    } 


private: 
    /// constructor is private 
    cMySingleton(void) 
    { 
    // fill map once here 
    m_map.insert("bla") = 1; 

    } 

    // static variable which is created before main() 
    static cMySingleton m_pSingleton; 

    std::map<string, int> m_map; 
};