在面向對象的程序開發中,一般將類和其成員函數的聲明放在指定的頭文件中,將成員函數的定義放在另一個源文件中。從而提高編程效率和實現信息隱蔽。下面以一個線性表爲例。
#ifndef seq_H
#define seq_H
const int MaxSize=100;
template <class T>
class SeqList
{
public:
SeqList();
SeqList(int a[],int n);
~SeqList();
int Length();
T Get(int i);
int Locate(T x);
void Insert(int i,T x);
T Delete(int i);
void PrintList();
private:
T data[MaxSize];
int length;
};
#endif
#include <iostream.h>
#include "seq.h"
template <class T>
SeqList<T>::SeqList()
{
length=0;
}
template <class T>
SeqList<T>::SeqList(int a[],int n)
{
if(n>MaxSize) throw "error";
for (int i=0;i<n;i++)
data[i]=a[i];
length=n;
}
template <class T>
int SeqList<T>::Length()
{
return length;
}
template <class T>
void SeqList<T>::Insert(int i,T x)
{
if(length>=MaxSize)
throw "shangyi";
if(i<1||i>length+1)
throw "weizhiyichang";
for(int j=length;j>=i;j--)
data[j]=data[j-1];
data[i-1]=x;
length++;
}
template <class T>
T SeqList<T>::Delete (int i)
{
if(length==0)
throw "xiayi";
if(i<1||i>length)
throw "weizhiyichang";
x=data[i-1];
for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}
template <class T>
T SeqList<T>::Get (int i)
{
if(i<1||i>length)
throw "chazhaoweizhifeifa";
else
return data[i-1];
}
template <class T>
int SeqList<T>::Locate (T x)
{
for (int i=0;i<length;i++)
if(data[i]==x)
return (i+1);
return 0;
}
其中值得注意的有兩點。首先是頭文件中的預處理命令。有時,一個複雜的項目中有包含其他文件的文件,這樣在編譯一個文件就存在一個頭文件被重讀兩次候兩個接口循環調用的危險。爲了避免這種情況,每個頭文件在讀類接口時都使用預處理命令定義一個符號。頭文件的第一行檢測該符號是否是未定義的,如果是,就接着處理文件否則就不處理(跳到#endif)。其次,在頭文件中使用了類模版,對於一個類聲明,只需定義一次類模版。而在源文件中定義函數,必須先將類模版實例華爲類SeqList<T>,再進行定義。在定義每一個函數時,都需要定義一次函數模版。