2011-07-31 9 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にの冒頭にこのような長いリストの一連のブラウジングを好きではないと思います。いったんコードが再びコードを見たいのであれば、そのために、この一連の行コードをMain.cppの外側のヘッダーまたはコードファイルに入れます。

このメソッドは、大文字小文字の区別がない場合にグローバル変数を使用したいという印象を与えます。私はちょっと前にフォーラムが私に示唆したようにそれを避けたい。

これは良い習慣であるか、ソースコードを読みやすくするための他の方法はありますか?事前に

おかげで、

ステファン

+0

それらの数十億。それらの多くは、相互に排他的であるか、または特定のプロジェクトに適用可能ではありません。残りのほとんどすべては主観的です。 – delnan

+5

いくつか例を挙げてください。マクロの不必要な使用は、コードを_less_読み取り可能にする傾向があります。また、この質問は[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

ベータ版の回答の代替案。シングルトンアプローチの使用を検討してください。 init_mnemo_list()のアプローチとは対照的に、マップは関数の呼び出しごとに1回ではなく、1回だけ作成されます。また、マップは1か所に定義されています。

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; 
}; 
関連する問題