从类模板引发的思考
C++中使用了模板来减少方法相同但是类型不一样带来的函数重载以及大量复制代码的问题。这里主要说说类模板
类模板的定义:
templateclass Stacks { public: Stacks(void); Stacks(int nSize); Stacks(Type Arr[],int nSize); ~Stacks(void); public: bool isEmpty(); bool isFull(); bool push(const Type &e); Type pop(); Type getTop(); int getLength(); void print(); private: int m_top; int m_nLength; Type *m_pArr; };
函数的实现:
函数实现既可以放在类定义体内,又可以放在类定义体外,但是不管放在体内还是体外都必须放在头文件中,这点和inline函数有点类似。
分离编译:
如果声明和定义分别放在h文件和cpp文件呢?
这个时候如果在其他程序中用到了模板类中的函数,那么就会出现
vcSjsOXA4MqxuvK74beiyfrSu9CpseS7r6OsyOe5+7Hg0uvG98TcvavEo7DlwOC1xMq1z9a6r8r9seDS67PJb2JqzsS8/qOsxMfDtNTa1eLQqbqvyv3W0NP2tb0gVHlwZaOowODQzc671sOjqaOsseDS68b3uMPU9cO0vau0+sLrt63S67PJttTTprXEu+Ox4LT6wuvE2KOs0rvQqXB1bGyjrHB1c2i4w7bU06a24MnZ19a92sTYo6zV4tCptrzKx8601qq1xKOsy/nS1LTTwO3C28nPvbKjrLy0sePO0sPHvavEo7DlwOC1xMn5w/e6zcq1z9bP4Lult9bA66OstavKx9TayfqzybXEttTTpm9ias7EvP7W0LK7u+HT0NK7uPa6r8r9tcQyvfjWxrT6wuu1xKGjPC9wPgo8cD48c3Ryb25nPsDgxKOw5bXEzNjK4rHg0uujujwvc3Ryb25nPjwvcD4KPHA+xMfDtLzIyLtvYmrW0MO709C2/r341sa6r8r9o6xtYWluuq/K/dPWysfI57rOtffTw8SjsOXA4NbQtcS6r8r9xNijrM7Sw8fWqrXA0ruw47XEwOCjrG1haW66r8r9tffTw8v81rvQ6NKq1qq1wNK7uPZsaW5rtdjWt77N0NCjrLWrysfV67bUxKOw5cDgvs2yu9K70fnBy6Osy/y74dTabWFpbrqvyv3L+dTatcRjcHDA78PmsNHTw7W9tcS6r8r9yrXA/buvo6i+zcrH08O+38zlwODQzczmu7vNqNPDwODQzaOpo6zV4tH5vs2/ydLUtffTw8v8wcujrNLyzqrSqszmu7ujrMv50tS+zbHY0OvWqrXAuq/K/bXEtqjS5cHLo6zV4r7NysfOqsqyw7Sx2NDrtcPU2tK7uPbOxLz+1tDKtc/WxKOw5cDgtcTJ+cP3us22qNLloaM8L3A+CjxwPiA8L3A+CjxwPjxzdHJvbmc+suLK1LrN0enWpKO6PC9zdHJvbmc+PC9wPgo8cD7NqLn91NrEo7DlwODW0NT2vNPSu7j21eLR+bXEuq/K/TwvcD4KPHByZSBjbGFzcz0="brush:java;">template
然后我们在main中调用print函数,在生成的debug文件中用notepad++打开main.obj,我们可以看到有这样的字符出现:
这就说明了问题,main.cpp中实例化了函数的定义。
附带栈结构实现的C++源代码
// Stacks.h
#pragma once
#include
using namespace std;
template
class Stacks { public: Stacks(void); Stacks(int nSize); Stacks(Type Arr[],int nSize); ~Stacks(void); public: bool isEmpty(); bool isFull(); bool push(const Type &e); Type pop(); Type getTop(); int getLength(); void print(); private: int m_top; int m_nLength; Type *m_pArr; }; template
Stacks
::Stacks(void) { m_top = -1; m_nLength = 10; m_pArr = new Type[10]; if (m_pArr == NULL) cout<<"Allocate stack failed"<
Stacks
::Stacks(int nSize) { m_top = -1; m_pArr = new Type[nSize]; if(m_pArr == NULL) cout<<"Allocate stack failed"<
Stacks
::Stacks(Type Arr[],int nSize) { m_top = -1; m_pArr = new Type[nSize]; if(m_pArr == NULL) cout<<"Allocate stack failed"<
bool Stacks
::isEmpty() { return m_top == -1; } template
bool Stacks
::isFull() { return m_top == m_nLength - 1; } template
Type Stacks
::getTop() { if (m_top != -1) return m_pArr[m_top]; else { cout<<"The stack is empty"<
Type Stacks
::pop() { if(m_top == -1) { cout<<"The stack is empty"<
bool Stacks
::push(const Type &e) { if(m_top == m_nLength-1) { cout<<"The stack is full"<
int Stacks
::getLength() { return m_nLength; } template
Stacks
::~Stacks(void) { if(m_pArr != NULL) { delete m_pArr; m_pArr = NULL; } } template
void Stacks
::print() { cout<<"This is a test ,I love you" <<"I love you,I love you"<
//main.cpp
#include
#include
#include"Stacks.h" using namespace std; void main() { int a[7] = {1,2,3,4,5,6,7}; Stacks
Sta(a,7); cout<