C++ 模板类的声明与定义

  •  条款1:C++ 模板类的声明与定义都放在 H 文件中 程序会顺利的运行,示例如下 。
 
  1.  //NewHandlerSupport.h 文件
  2. template<class T>
  3. class NewHandlerSupport
  4. {
  5. public:
  6.     NewHandlerSupport(void);
  7.     ~NewHandlerSupport(void);

  8.     static new_handler set_new_handler(new_handler p);
  9.     static void * operator new(size_t size);

  10. private:
  11.     static new_handler currentHandler;
  12. };

  13. template<class T>
  14. new_handler NewHandlerSupport<T>::currentHandler;

  15. template<class T>
  16. NewHandlerSupport<T>::NewHandlerSupport(void)
  17. {
  18. }

  19. template<class T>
  20. NewHandlerSupport<T>::~NewHandlerSupport(void)
  21. {
  22. }

  23. template<class T>
  24. new_handler NewHandlerSupport<T>::set_new_handler(new_handler p)
  25. {
  26.     new_handler oldHandler = currentHandler;
  27.     currentHandler = p;
  28.     return oldHandler;
  29. }

  30. template<class T>
  31. void *  NewHandlerSupport<T>::operator new(size_t size)
  32. {
  33.     new_handler globalHandler = std::set_new_handler(currentHandler);
  34.     void *memory;
  35.     try {
  36.         memory = ::operator new(size);
  37.     }
  38.     catch (std::bad_alloc &) {
  39.         std::set_new_handler(globalHandler);
  40.         throw;
  41.     }

  42.     std::set_new_handler(globalHandler);
  43.     return memory;  
  44. }


  • 条款2:C++ 模板类的声明与定义分别放在 H 文件 和 CPP文件中 在使用时需要把 CPP文件也饱含与当前文件中 如: #include "文件名.cpp"。示例如下:
 
  1. //TestNew.h 头文件
  2. #include "newhandlersupport.h"

  3. template<class T>
  4. class TestNew :
  5.     public NewHandlerSupport<T>
  6. {
  7. public:
  8.     TestNew(void);
  9.     ~TestNew(void);
  10.     static const int iArraySize;
  11.     T *pBigDataArray;
  12.     T *pBigDataArray2;
  13.     T *pBigDataArray3;
  14.     T *pBigDataArray4;
  15.     T *pBigDataArray5;
  16.     T *pBigDataArray6;
  17.     T *pBigDataArray7;
  18. };

  19. //TestNew.cpp 文件

  20.  #include "TestNew.h"
  21. template<class T>
  22. const int TestNew<T>::iArraySize = 100000000;

  23. template<class T>
  24. TestNew<T>::TestNew(void)
  25. {
  26.     //static const INT64 iArraySize = 100000000;
  27.     pBigDataArray = new T[iArraySize];

  28.     pBigDataArray2 = new T[iArraySize];
  29.     pBigDataArray3 = new T[iArraySize];
  30.     pBigDataArray4 = new T[iArraySize];
  31.     pBigDataArray5 = new T[iArraySize];
  32.     pBigDataArray6 = new T[iArraySize];
  33.     pBigDataArray7 = new T[iArraySize];
  34. }

  35. template<class T>
  36. TestNew<T>::~TestNew(void)
  37. {
  38.     delete [] pBigDataArray;
  39.     delete [] pBigDataArray2;
  40.     delete [] pBigDataArray3;
  41.     delete [] pBigDataArray4;
  42.     delete [] pBigDataArray5;
  43.     delete [] pBigDataArray6;
  44.     delete [] pBigDataArray7;
  45. }

  46. ///testNoMoreMemory.cpp : 定义控制台应用程序的入口点 执行文件
  47. #include <iostream>
  48. using namespace std;

  49. #include "TestNew.h"
  50. #include "TestNew.cpp"//注意这里的调用 如果无此句会出现obj文件的链接错误

  51. void NoMoreMemory()
  52. {
  53.     cerr<<" Unalle to satisfy request for memory/n";
  54.     abort();
  55. }
  56. int _tmain(int argc, _TCHAR* argv[])
  57. {
  58.     TestNew<int> *Test1 = new TestNew<int>;
  59.     return 0;
  60. }   

  若缺少 58行便会有此错误发生:testNoMoreMemory.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall TestNew<int>::TestNew<int>(void)" (??0?$TestNew@H@@QAE@XZ),该符号在函数 _wmain 中被引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值