编程低手箴言(二)

map
map可以看做是一个增强型的数组,通常数组的下标是从0开始的连续整数,而map在使用上可以用更多的数据类型来做下标。
我们经常遇到这样的任务:由一项去查找对应的另一项,例如由人名查找电话,由窗口句柄查找对应的CWnd指针,由编号去查对应的图书等等。这样的问题有许多种数据结构和算法来解决,但是这不是我们研究的方向,我告诉大家一个最简单的解决方案,用map,虽然它不是效率最高的,但是最简单。如我上面说的三个问题可以这样定义:
map<string, string> name2tel;
map<HWND, CWnd*> wndmap;
map<int, CBookInfo*> bookmap;
最简单的用法如下:
name2tel["张三"] = "12345678";
name2tel["李四"] = "87654321";
printf("李四的tel=%s/n",name2tel["李四"].c_str());
此外map还提供查找(find),插入(insert)等方法用于进一步精确控制你要的结果.map的遍历如前所述,也是可以采用iterator,具体使用方法读者可以自己写程序试试。如果是第一次,你一定会遇到问题,为了得到提高,你应该通过查看STL中map的源代码的方法自己解决。

二、编译与链接

说实话,这个问题是初学者的一个拦路虎,就算编了好几年程序的人也不敢说自己能完全搞定这方面问题。所以,在这里我不可能说清楚全部的情况,我只能给出一个解决问题的途径。
语法级的编译错误
这些问题基本上是由于C++语法不熟悉造成的,例如括号不匹配、拼写错误等等造成。这类错误通常可以按照编译器给出的错误信息来改,或者从编译器厂商的开发文档中找到进一步解释。

工程级编译错误
要解决这类的编译错误,首先一定要明白C++代码是怎么组织起来的。理论上,你可以把所有的C++代码都写到一个.cpp文件中,可是这样不利于维护。所以C++语言采用的是分开编译并链接的方式来做。即可以把代码写在多个.cpp文件中分别编译,最后用链接器link而成。对于用集成环境来入门的读者,通常不需要手工做这些步骤,不过在编译时,从集成环境的输出窗口你可以看到整个过程。
大家都知道#include,其实#include也没做别的事情,只是把引号中的文件直接包含进来,然后编译器视作一个文件进行编译。所以在编译器的眼中只能看得见.cpp文件。
我们结合具体的编译错误来说明,可能更有助于理解:(以下错误信息都只表述大意,读者可以自己去对照具体编译器的出错信息)
1 "标志符未声明"
这类错误通常与头文件有关,通过#include正确的头文件就可以解决。深层的原因是一个变量、或者函数、或者类都必须先声明才能使用,只要声明出现在使用之前,错误就能得到解决,无论该声明是放置在某个头文件然后被#include进来还是直接在cpp文件中写的都可以。不过自己在cpp中直接声明容易产生不一致,通常我们都是把声明放到头文件中。那么怎么知道一个函数或者类在哪个头文件中呢?我一直在采用的方法用是Find in Files这个功能,VC的IDE中有,UltraEdit也有。如果不知道在哪些目录中去找,你可以先找一下哪些目录中有*.h文件,它们都是可疑目标。
2 "XXX已经在声明过了"
这类错误与重复包含头文件有关、也有可能是不同的头文件却定义了同一个名字,也就是常说的名字冲突。重复包含的问题好解决,你注意一下有经验的人写的头文件中的前几行就知道怎么做了(#ifndef...#define...)。而名字冲突,比较麻烦,你可以修改自己的代码,使得两个不同的头文件不在一个cpp文件中被包含。
3 "未解决的外部符号"
这是一个链接错误,某个符号虽然有声明,但是找不到定义。有可能你忘记把定义所在的cpp文件放在工程中编译了,也有可能你用到了template,而template的实现却写在了cpp文件中。也可能那个定义在lib中,你需要找到相应的lib,然后加入到工程中来,找lib也可以用find in files的方法进行。还有一种可能是定义与声明的约定不一样,例如C文件中定义了某个函数,在cpp文件中使用的话,如果没有在定义前加上extern "C",那么就会出这个错。
4 "符号多重定义"
这个问题可能是你把某个实现放入了头文件中,而两个以上的cpp文件都包含了这个头文件。否则解决起来就一言难尽了。因为可能错误不出来你的代码中,而是在各种运行库、第三方库等等地方。解决的方法也多种多样。
工程级的编译和链接错误情况还有许多,很难全部说清楚,有一些解决方法是富有技巧性的而非指导性的,需要慢慢积累。不过有个通用途径,在自己解决不了时,可以试一下,就是把错误信息整条copy下来找个搜索引擎搜索一下,因为你是第一个遇到这种错误的人的几率是很小的。当然如果错误的符号完全是你自己写的(如MyFuncion之类)那就不必搜了。

三、代码的组织 

<未完待续>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值