码迷,mamicode.com
首页 > 编程语言 > 详细

学艺不精而羞愧--论C++模板类的使用

时间:2015-07-25 01:46:50      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:模板类   c++   

自己断断续续地使用C++也有一段时间了,有些时候产生了自满的情绪,认为自己对C++的语言特性已经知道的差不多了,在语法方面没有什么难倒我的地方了,现在所要做的是根据实际问题编写程序,问题的难点在于算法的设计和分析,在于解决问题的策略了。然而今天下午的一次经历给自己当头一棒:永远不要自满,要保持一颗谦虚的学习的心。

1 问题的产生

我在实现[书][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"这样的用法,我也对这种用法感觉非常的不舒服。我决定对该问题一探究竟。

2 对模板类使用方法的在认识

我以前读过[Bruce Eckel的书][2],对其中关于template class的介绍已经模糊了,但凭我的直觉,一定不会使用#include "rblist.cpp"这样的方法来使用模板类,事实上也正验证了我的直觉。该书给出了4中方法使用模板类:

  1. Inline function definition: 将方法的定义写在类的声明中,同时将main()函数与该模板类写在同一个文件中。这种方法简单易用,通常出现在教科书中,实际的工程项目中根本不会用这种方式使用模板类。初学C++的时候我按此方法练习了模板类的使用,也正是因为此方法让我误认为我已经掌握了模板类的使用方法。
  2. Non-inline function definitnion: 该方法将类函数定义在类声明的外部,函数定义和类声明仍然在同一个文件中,同时用于测试的main()函数也在同一文件中,最后整个文件为cpp文件。这种方法给出了模板类的定义的新视角,将函数从类声明分离出去,但由于它们仍然在同一文件中,在源文件头部仍然不需要出现#include 模板类的命令。这种方法以及前一种方法不会产生本文遇到的问题。
  3. Header files: 这种方法将整个模板类声明和定义统一写于一个头文件.h中。原文这样说: “Don’t put in anything that allocates storage,”, but template definitions are special. Anything preceded by template<..> means the compiler won’t allocate storage for it at that point, but will instead wait until it’s told to. So you’ll almost always put the entire template declaration and definition in the header file, for ease of use. 我采用此方法重新写了一个文件rbList2.h文件,将模板里List的声明和定义统统写在里面,然后使用#include "rblist2.h"将其包含在testList.cpp中,使用g++ Utility.cpp testList.cpp -o testList编译,顺利通过编译。我是比较认可这种方式使用模板类的。我看到以前阅读[书][2]时相应的句子上面做的标记,可是一到实际的问题中,还是把它忘记的一干二净。看来,要想学好语言,光看不练是不行的,要在看基本知识的前提下多多编程,通过实际编程经验来提高编程能力。比如,我编程中遇到本文的问题,回头来在去看以前看过的书,经过这样一个循环反复的过程后,对相应的问题理解的就深刻了。以前初学时候认为很难、很高大上的概念和知识点就变得很容易了。知道了该概念出现的背景,它给编程人员带来的好处等等,比仅仅知道如何具体的用要理解的深刻的多,而且也不会遗忘。
  4. [Bruce Eckel][2]也提到了模板类的声明和定义分别写在.h文件和.cpp文件中的做法,但这仅仅为了产生dll而不得不做的妥协的做法,指出该方法需要参考具体的编译器规定。这种方法很少见,我想这可能就是#include "rblist.cpp"这样的用法吧。

3 感悟

通过今天这个经历,使我认识到:

  1. 永远保持一颗谦虚的心很重要。不要自满,在该学习的地方停止学习了。
  2. 学习编程的最好的做法就是多多编程,编的越多,其中感觉神秘的地方就会变得越来越少了,自己也就会越来越充实。

[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.

版权声明:本文为博主原创文章,未经博主允许不得转载。

学艺不精而羞愧--论C++模板类的使用

标签:模板类   c++   

原文地址:http://blog.csdn.net/robertchenguangzhi/article/details/47050939

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!