作者在 2008-04-15 00:36:06 发布以下内容
在面向对象的程序开发中,一般将类和其成员函数的声明放在指定的头文件中,将成员函数的定义放在另一个源文件中。从而提高编程效率和实现信息隐蔽。下面以一个线性表为例。
//seq.h
#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
#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
//seq.cpp
#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;
}
#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>,再进行定义。在定义每一个函数时,都需要定义一次函数模 版。