- 条款1:C++ 模板类的声明与定义都放在 H 文件中 程序会顺利的运行,示例如下 。
- //NewHandlerSupport.h 文件
- template<class T>
- class NewHandlerSupport
- {
- public:
- NewHandlerSupport(void);
- ~NewHandlerSupport(void);
- static new_handler set_new_handler(new_handler p);
- static void * operator new(size_t size);
- private:
- static new_handler currentHandler;
- };
- template<class T>
- new_handler NewHandlerSupport<T>::currentHandler;
- template<class T>
- NewHandlerSupport<T>::NewHandlerSupport(void)
- {
- }
- template<class T>
- NewHandlerSupport<T>::~NewHandlerSupport(void)
- {
- }
- template<class T>
- new_handler NewHandlerSupport<T>::set_new_handler(new_handler p)
- {
- new_handler oldHandler = currentHandler;
- currentHandler = p;
- return oldHandler;
- }
- template<class T>
- void * NewHandlerSupport<T>::operator new(size_t size)
- {
- new_handler globalHandler = std::set_new_handler(currentHandler);
- void *memory;
- try {
- memory = ::operator new(size);
- }
- catch (std::bad_alloc &) {
- std::set_new_handler(globalHandler);
- throw;
- }
- std::set_new_handler(globalHandler);
- return memory;
- }
- 条款2:C++ 模板类的声明与定义分别放在 H 文件 和 CPP文件中 在使用时需要把 CPP文件也饱含与当前文件中 如: #include "文件名.cpp"。示例如下:
- //TestNew.h 头文件
- #include "newhandlersupport.h"
- template<class T>
- class TestNew :
- public NewHandlerSupport<T>
- {
- public:
- TestNew(void);
- ~TestNew(void);
- static const int iArraySize;
- T *pBigDataArray;
- T *pBigDataArray2;
- T *pBigDataArray3;
- T *pBigDataArray4;
- T *pBigDataArray5;
- T *pBigDataArray6;
- T *pBigDataArray7;
- };
- //TestNew.cpp 文件
- #include "TestNew.h"
- template<class T>
- const int TestNew<T>::iArraySize = 100000000;
- template<class T>
- TestNew<T>::TestNew(void)
- {
- //static const INT64 iArraySize = 100000000;
- pBigDataArray = new T[iArraySize];
- pBigDataArray2 = new T[iArraySize];
- pBigDataArray3 = new T[iArraySize];
- pBigDataArray4 = new T[iArraySize];
- pBigDataArray5 = new T[iArraySize];
- pBigDataArray6 = new T[iArraySize];
- pBigDataArray7 = new T[iArraySize];
- }
- template<class T>
- TestNew<T>::~TestNew(void)
- {
- delete [] pBigDataArray;
- delete [] pBigDataArray2;
- delete [] pBigDataArray3;
- delete [] pBigDataArray4;
- delete [] pBigDataArray5;
- delete [] pBigDataArray6;
- delete [] pBigDataArray7;
- }
- ///testNoMoreMemory.cpp : 定义控制台应用程序的入口点 执行文件
- #include <iostream>
- using namespace std;
- #include "TestNew.h"
- #include "TestNew.cpp"//注意这里的调用 如果无此句会出现obj文件的链接错误
- void NoMoreMemory()
- {
- cerr<<" Unalle to satisfy request for memory/n";
- abort();
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- TestNew<int> *Test1 = new TestNew<int>;
- return 0;
- }