zoukankan      html  css  js  c++  java
  • C++模板应用——让模板定义和实现分离的方法


    关于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中的类型也要跟着改变,有点笨拙的方法

  • 相关阅读:
    【Thinking in Java, 4e】初始化与清理
    【Thinking in Java, 4e】控制流程执行
    【Beginning Python】抽象(未完)
    【Python】装饰器 & 偏函数
    【c++ primer, 5e】函数声明 & 分离式编译
    【Python】闭包 & 匿名函数
    【c++ primer, 5e】【函数基础】
    【Python】高阶函数
    变相的取消Datagridview控件的选中状态
    NotifyICon控件使用
  • 原文地址:https://www.cnblogs.com/lscheng/p/2216569.html
Copyright © 2011-2022 走看看