2011-07-31 58 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; 
};