自己断断续续地使用C++也有一段时间了,有些时候产生了自满的情绪,认为自己对C++的语言特性已经知道的差不多了,在语法方面没有什么难倒我的地方了,现在所要做的是根据实际问题编写程序,问题的难点在于算法的设计和分析,在于解决问题的策略了。然而今天下午的一次经历给自己当头一棒:永远不要自满,要保持一颗谦虚的学习的心。
我在实现[书][1]中219页的list的contiguous结构时,按照我的惯性,写了两个文件:rblist.h和rblist.cpp,分别为类定义和方法的具体实现。rblist.h中包含了模板类的定义。我又写了测试程序testList.cpp来测试这个连续存储的表结构时遇到了麻烦。
我使用的编译命令为:
g++ Utility.cpp rblist.cpp testList.cpp -o testList
而在testList.cpp中我使用的是#include "rblist.h"
这条预处理指令,编译出错如下:
我前后几次确认代码没错,检查几遍还是编译不通过。我又将rblist中的代码删减到只剩一个方法仍然编译不过。没办法只有通过网上搜索解决办法了。果真找到了解决办法,代码和编译命令保持不变,而仅仅将testList.cpp中的包含指令改为#include "rblist.cpp"
就顺利通过编译了。
我对预包含指令包含cpp文件的做法感到非常奇怪。我从没见过经常包含头文件的命令可以用于包含cpp文件,而且能够保证编译成功,而且网上的那位朋友指出,这是使用模板类容易犯的错误。我对此产生疑问,在我所读过的任何教科书中,从没见过#include "rblist.cpp"
这样的用法,我也对这种用法感觉非常的不舒服。我决定对该问题一探究竟。
我以前读过[Bruce Eckel的书][2],对其中关于template class的介绍已经模糊了,但凭我的直觉,一定不会使用#include "rblist.cpp"
这样的方法来使用模板类,事实上也正验证了我的直觉。该书给出了4中方法使用模板类:
#include 模板类
的命令。这种方法以及前一种方法不会产生本文遇到的问题。#include "rblist2.h"
将其包含在testList.cpp中,使用g++ Utility.cpp testList.cpp -o testList
编译,顺利通过编译。我是比较认可这种方式使用模板类的。我看到以前阅读[书][2]时相应的句子上面做的标记,可是一到实际的问题中,还是把它忘记的一干二净。看来,要想学好语言,光看不练是不行的,要在看基本知识的前提下多多编程,通过实际编程经验来提高编程能力。比如,我编程中遇到本文的问题,回头来在去看以前看过的书,经过这样一个循环反复的过程后,对相应的问题理解的就深刻了。以前初学时候认为很难、很高大上的概念和知识点就变得很容易了。知道了该概念出现的背景,它给编程人员带来的好处等等,比仅仅知道如何具体的用要理解的深刻的多,而且也不会遗忘。#include "rblist.cpp"
这样的用法吧。通过今天这个经历,使我认识到:
[1]: Robert L. Kruse and Alexander J. Ryba. Data Structures and Program design in C++. Upper Saddle River, 2000.
[2]: Bruce Eckel. Thinking in C++ Volume 1. 2nd. 2000.
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/robertchenguangzhi/article/details/47050939