• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++模板应用——让模板定义和实现分离的方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


关于c++中类的模板,惯常的用法都是把实现和定义放在头文件里了事。这样的问题是,加大了头文件的长度,减低了模板代码的可读性,还有就是破坏了面向对象的隐藏实现的规则。下面就是这种问题的两个解决方案的总结。

假设模板代码如下:

 1 // 模板定义 a.h
2 #include <stdio.h>
3
4 template <class tType>
5 class TTEST
6 ...{
7 private:
8 tType i ;
9 public:
10 void output();
11 } ;
12
13 // 模板实现 a.cpp
14 #include "a.h"
15
16 template<class tType>
17 void TTEST<tType>::output()
18 ...{
19
20 printf("output: ") ;
21 }
22
23 // 调用模块 test.cpp
24 #include "a.cpp"
25
26 int main()
27 ...{
28 TTEST<int> t ;
29 t.output();
30 return 1 ;
31 }


注意调用模块test.cpp中,不要包含头文件a.h直接包含a.cpp,这样就能够编译成功。这是由于编译器要建立 TTEST<int> 这个类型需要模板实现,但从头文件里没找到,所以它会认为实现在其它编译单元中,但它不会报错,而把找实现部分的工作留给了linker。linker同样也是找不到实现,因此就不能生成TTEST<int>。上述第一种解决方法直接包含了实现文件,让compiler直接找到定义和实现,这样的效果跟把定义和实现都放在a.h里是一样的。
第二中方法,类似第一种,只是test.cpp只包含a.h,然后新增一个文件impl.cpp内容如下:

1 // impl.cpp
2
3 #include "a.cpp"
4
5 template class TTEST<int> ;


如此一来,也能达到定义与实现分离的目的。只是也要包含a.cpp,另外随着模板实例化不同的类型,impl,cpp中的类型也要跟着改变,有点笨拙的方法


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#WebService不使用服务引用直接调用方法(转)发布时间:2022-07-13
下一篇:
关于C++输出中文乱码的解决方案发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap