ofstream &operator<<(ofstream& ,const Gra_adjmul<T,E> &); 声明
ofstream &operator<<(ofstream&s ,const Gra_adjmul<T,E> & G)
{。。}; 定义
变量必须先声明后使用,函数也必须在调用前先声明。与变量的定义类似,函数的声明也可以与定义分离。一个函数只能被定义一次,但声明可多次。
函数声明由 函数返回类型,函数名,形参列表 组成。形参列表必须包括形参类型,但是不必对形参命名。
这3个元素称为函数原型(function prototype),函数原型为定义函数的程序员和使用程序的程序员定义了接口。
函数声明中形参名会被忽略, 如果在生命中给出形参的名字,它应该当做辅助文档:
template<class T,class E>
class Gra_adjmul; //类声明,下面的函数声明的形参类型用到。
template<class T,class E>
std::ifstream& into(std::ifstream& ,const Gra_adjmul<T,E> & );
template<class T,class E>
ofstream & outfrom(ofstream& ,const Gra_adjmul<T,E> &); //声明为友元前,应先声明函数模板。
template<class T,class E>
class Gra_adjmul//:public Graph<T,E>
{
friend ifstream &operator>>(ifstream& ,const Gra_adjmul<T,E> & );
friend ofstream &operator<<(ofstream& out,Gra_adjmul<T,E> &G);
public:
ifstream & into(ifstream& in );
ofstream & outfrom(ofstream& out);
Gra_adjmul(int sz=DefaultVertices)
{
Nodet=new Vertex<T,E>[sz];
numV=0;numE=0;maxV=sz;numW=0;
//cout<<maxV<<endl;
if (Nodet==NULL){cerr<<"分配内存错误!"<<endl; exit(1);}
for (int i=0;i<maxV;i++)
{
Nodet[i].firstin=NULL;
Nodet[i].firstout=NULL;
}
}
~Gra_adjmul();
T getValue(int i)
{
return (i>=0&&i<numV)?Nodet[i].data:0;
}
E getWeight(int v1,int v2);
int NumOfVertices(){return numV;}
int NumOfEdges() {return numE;}
int NumW() {return numW;}
bool insertVertex(const T& vertex,int c);
bool removeVertex(int v);
bool insertEdge(int ,int ); //声明 ,形参名不必写、
bool removeEdge(int ver1,int ver2); //形参名 用作辅助文档
int getFirstout(int ver);
int getNextin(int ver,int w);
int getVertexPos(const T &ver)
{
for(int i=0;i<numV;i++)
if(Nodet[i].data==ver) return i;
return -1;
}
private:
Vertex<T,E> *Nodet;
int maxV;
int numE;
int numV;
int numW;
/*int getVertexPos(const T &ver)
{
for(int i=0;i<numV;i++)
if(Nodet[i].data==ver) return i;
return -1;
}*/
};
把函数声明 直接放到每个使用该函数的源文件中,这是大家希望的方式,也是合法的。但此法较呆板 易出错。解决的方法是把函数声明放在头文件中,这样可以确保对于指定函数其所有的声明保持一致。 如果函数接口发生变化,只要修改其唯一的声明即可。