| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 860 人关注过本帖
标题:[求助]怎样把较长的文件分别写在不同的文件里
只看楼主 加入收藏
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
收藏
 问题点数:0 回复次数:8 
[求助]怎样把较长的文件分别写在不同的文件里

比如下面这个.cpp文件,由于将要写的main函数很长,想把它放在另一个.cpp文件里,一起编译。
请问文件头要包含什么,还有要做什么别的改动或者添加什么文件
谢谢

#include<iostream.h>
//using namespace std;
/****************************************************************************************/
template<class T>
struct Term
{
Term(int e):exp_x(e){link=NULL;}
Term(T c,int e_x,int e_y,Term *next):coef(c),exp_x(e_x),exp_y(e_y){link=next;}
Term* InsertAfter(T c,int e_x,int e_y);
T coef;
int exp_x;
int exp_y;
Term *link;
};

template<class T>
Term<T>* Term<T>::InsertAfter(T c,int e_x,int e_y)
{
link=new Term<T>(c,e_x,e_y,link);//构造新项节点<c,e>,插在当前节点及其后继节电之间
return link;
}

template<class T>
ostream & operator<<(ostream & out,const Term<T> & val)//每个单项式的输入法
{
if(val.coef==0) return out;
else
{
if((val.exp_x || val.exp_y)==0)
out<<val.coef;
else if((val.exp_y==0) && (val.exp_x!=0 ))
out<<val.coef<<"X^"<<val.exp_x<<endl;
else if((val.exp_x==0) && (val.exp_y!=0 ))
out<<val.coef<<"Y^"<<val.exp_y<<endl;
else
out<<val.coef<<"X^"<<val.exp_x<<"*Y^"<<val.exp_y<<endl;
}

return out;
}
/*******************************************************************************************/
template<class T>
class Polynomial
{
public:
Polynomial();//构造只有表头节点的单循环链表
~Polynomial();//析构函数释放多项式的各项节点
void AddTerms(istream& in);//按X降幂输入多项式各项
void Output(ostream& out)const;//输出多项式
Polynomial& PolyAdd(const Polynomial& x,const Polynomial& y);
Polynomial& PolyMul(const Polynomial& x,const Polynomial& y);
Polynomial& PolyPow(const Polynomial& x,const int& k);
void operator=(const Polynomial &x);//重载=运算符
void Clear();//清除this多项式
//Private:
Term<T>* theList;
friend ostream& operator<<(ostream&,const Polynomial&);//输出多项式
friend istream& operator>>(ostream&,const Polynomial&);//输入多项式
};

template<class T>
Polynomial<T>::Polynomial()
{
theList=new Term<T>(-1);//构造一个表头节点
theList->link=theList;//形成只有表头节点的空单循环链表

}

template<class T>
Polynomial<T>::~Polynomial()
{
Clear();//释放多项式链表的各项节点
delete theList;//释放表头节点
}

template<class T>
void Polynomial<T>::Clear()
{//释放多项式链表中的各项节点,但仍保留表头节点,代表空多项式
Term<T>* q=theList,*r;
for(r=q->link;r!=theList;r=q->link)
{
q->link=r->link;
delete r;
}
}
/********************************************************************************************/
template<class T>
void Polynomial<T>::AddTerms(istream & in)
{
Term<T>* q=theList;//q指空链表的表头节点
T c;int e_x;int e_y;
for(;;)
{
cout<<"Input a term(coef,exp_x,exp_y):\n"<<endl;
in>>c>>e_x>>e_y;
if(e_x<0)break;//如指数出现负值,输入完毕
q=q->InsertAfter(c,e_x,e_y);//构造新节点<c,e_x,e_y>,插入*q之后,q指示新节点
}
}

template <class T>
void Polynomial<T>::Output(ostream& out)const
{
bool start=true;
Term<T> *p=theList->link;//p指示最高幂次节点
out<<"The polynomial is:\n"<<endl;
for(;p!=theList;p=p->link)//p再次指向表头节点时算法终止
{
if((!start) && (p->coef>0)) out<<'+';//如果不是最高幂次项,正系数项前加'+'
start=false;//表示当前输入的项不是最高次项
out<<*p;
}
out<<endl;

}
//以上为多项式的输入和输出
/*******************************************************************************************/
int ExpComp(int e_x_1,int e_y_1,int e_x_2,int e_y_2)//以x的升幂排列
{
if((e_x_1==e_x_2)&&(e_y_1==e_y_2)) return 0;
else if((e_x_1>e_x_2)||(e_x_1==e_x_2)&&(e_y_1>e_y_2)) return 1;
else return -1;
}


template <class T>
Polynomial<T>& Polynomial<T>::PolyAdd(const Polynomial<T>& s,const Polynomial<T>& t)
{
Clear();
Term<T> *r=theList,*p=s.theList->link,*q=t.theList->link;
while(p->exp_x>=0||p->exp_y>=0||q->exp_x>=0||q->exp_y>=0)
{
switch(ExpComp(p->exp_x,p->exp_y,q->exp_x,q->exp_y))
{
case -1:
r=r->InsertAfter(q->coef,q->exp_x,q->exp_y);
q=q->link;break;
case 0:
if(q->coef+p->coef!=0)
r=r->InsertAfter(p->coef+q->coef,p->exp_x,p->exp_y);
p=p->link;q=q->link;break;
case 1:
r=r->InsertAfter(p->coef,p->exp_x,p->exp_y);
p=p->link;break;
}
}
return *this;
}
//以上为二元多项式加法的实现
/* *******************************************************************************************/
template<class T>
Polynomial<T>& Polynomial<T>::PolyMul(const Polynomial<T>& x,const Polynomial<T>& y)
{
Polynomial<T> s,t;Clear();
Term<T>* q;
Term<T>*p=y.theList->link;
for(;p!=y.theList;p=p->link)
{
s=x;
for(q=s.theList->link;q!=s.theList;q=q->link)
{q->coef=q->coef*p->coef;
q->exp_x=q->exp_x+p->exp_x;
q->exp_y=q->exp_y+p->exp_y;
}
t=PolyAdd(s,t);
}
return *this;
}
//以上为二元多项式乘法的实现
/**********************************************************************************************/
template<class T>
Polynomial<T>& Polynomial<T>::PolyPow(const Polynomial& x,const int& k)
{
Polynomial<T> s;
Clear();
int n=k;
while(n!=0)
{
s=PolyMul(x,x);
n--;
break;
}
return *this;
}
//以上为二元多项式乘方的实现
/*********************************************************************************************/
template <class T>
ostream& operator<<(ostream &out,const Polynomial<T>& s)
{
s.Output(out);
return out;
}

template<class T>
istream& operator>>(istream& in,Polynomial<T> &t)
{
t.AddTerms(in);
return in;
}

template<class T>
void Polynomial<T>::operator=(const Polynomial<T>& s)
{
if(this==&s)return;
Clear();
Term<T>* q=theList, *p=s.theList->link;
for(;p!=s.theList;p=p->link)
q=q->InsertAfter(p->coef,p->exp_x,p->exp_y);
}
//以上为重载运算符

/******************************************************************************************/
main()
{








}

搜索更多相关主题的帖子: 文件 
2006-02-28 12:01
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 

把类的定义放在.h文件,类的实现放在.cpp文件,cpp文件里引用.h文件。
main可以单独放一个cpp文件,引用.h文件。


成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-28 13:08
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
收藏
得分:0 

谢谢斑竹

2006-02-28 15:51
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
收藏
得分:0 

又有问题了
我把下面这段代码弄到了.h里

#include<iostream.h>
template<class T>
struct Term
{
Term(int e):exp_x(e){link=NULL;}
Term(T c,int e_x,int e_y,Term *next):coef(c),exp_x(e_x),exp_y(e_y){link=next;}
Term* InsertAfter(T c,int e_x,int e_y);
T coef;
int exp_x;
int exp_y;
Term *link;
};

template<class T>
class Polynomial
{
public:
Polynomial();//构造只有表头节点的单循环链表
~Polynomial();//析构函数释放多项式的各项节点
void AddTerms(istream& in);//按X降幂输入多项式各项
void Output(ostream& out)const;//输出多项式
Polynomial& PolyAdd(const Polynomial& x,const Polynomial& y);
Polynomial& PolyMul(const Polynomial& x,const Polynomial& y);
Polynomial& PolyPow(const Polynomial& x,const int& k);
void operator=(const Polynomial &x);//重载=运算符
void Clear();//清除this多项式
//Private:
Term<T>* theList;
friend ostream& operator<<(ostream&,const Polynomial&);//输出多项式
friend istream& operator>>(ostream&,const Polynomial&);//输入多项式
};

其他按照斑竹所说的做了,但是报错全关于<<,>>运算符,
是不是重载还有哪几句话要放在头文件里,
谢谢

2006-02-28 16:54
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
收藏
得分:0 

请问斑竹去哪里了
没有人理我
555
上面的问题

2006-03-01 17:11
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
报的什么错? 关于 , 的还是 关于 &lt;&lt; 的?

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-03-01 17:17
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

模板好象不支持分离编译,虽然说有个export关键字,但不知道怎么回事.

把模板声名和定义放到同一个头文件里.


2006-03-01 19:27
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
收藏
得分:0 

编译错误如下:


LINK : LNK6004: Debug/two_poly.exe not found or not built by the last incremental link; performing full link
inverse.obj : error LNK2001: unresolved external symbol "public: __thiscall Polynomial<double>::~Polynomial<double>(void)" (??1?$Polynomial@N@@QAE@XZ)
inverse.obj : error LNK2001: unresolved external symbol "public: class Polynomial<double> & __thiscall Polynomial<double>::PolyMul2(class Polynomial<double> const &,double const &)" (?PolyMul2@?$Polynomial@N@@QAEAAV1@ABV1@ABN@Z)
inverse.obj : error LNK2001: unresolved external symbol "public: void __thiscall Polynomial<double>::Clear(void)" (?Clear@?$Polynomial@N@@QAEXXZ)
inverse.obj : error LNK2001: unresolved external symbol "public: void __thiscall Polynomial<double>::operator=(class Polynomial<double> const &)" (??4?$Polynomial@N@@QAEXABV0@@Z)
inverse.obj : error LNK2001: unresolved external symbol "public: class Polynomial<double> & __thiscall Polynomial<double>::PolyAdd(class Polynomial<double> const &,class Polynomial<double> const &)" (?PolyAdd@?$Polynomial@N@@QAEAAV1@ABV1@0@Z)
inverse.obj : error LNK2001: unresolved external symbol "public: class Polynomial<double> & __thiscall Polynomial<double>::PolyPow(class Polynomial<double> const &,int const &)" (?PolyPow@?$Polynomial@N@@QAEAAV1@ABV1@ABH@Z)
inverse.obj : error LNK2001: unresolved external symbol "class ostream & __cdecl operator<<(class ostream &,class Polynomial<double> const &)" (??6@YAAAVostream@@AAV0@ABV?$Polynomial@N@@@Z)
inverse.obj : error LNK2001: unresolved external symbol "class istream & __cdecl operator>>(class istream &,class Polynomial<double> const &)" (??5@YAAAVistream@@AAV0@ABV?$Polynomial@N@@@Z)
inverse.obj : error LNK2001: unresolved external symbol "public: __thiscall Polynomial<double>::Polynomial<double>(void)" (??0?$Polynomial@N@@QAE@XZ)
Debug/two_poly.exe : fatal error LNK1120: 9 unresolved externals
Error executing link.exe.

2006-03-01 19:28
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
收藏
得分:0 
我把除了main以外的代码全放进.h里就可以了
应该是7楼gg说的那样的原因吧

不知道能不能还是将.h和.cpp分开,这样毕竟看起来舒服些
2006-03-01 19:51
快速回复:[求助]怎样把较长的文件分别写在不同的文件里
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018190 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved