C++高手帮帮忙,看看为什么编译不过去呢

NeuSoftRen 2005-11-18 10:34:12
在头文件中Expr_node.h中,如下
#include<string>
#include<ostream.h>
class Expr_node;
class Int_node;
class Unary_node;
class Binary_node;

class Expr
{
friend ostream& operator<<(ostream& o,const Expr& t);
Expr_node* p;

public:
Expr(int n)
{
p = new Int_node(n);
}

Expr(const string& op, Expr t)
{
p = new Unary_node(op,t);
}

Expr(const string& op, Expr left , Expr right)
{
p = new Binary_node(op,left,right);
}

Expr(const Expr& t)
{
p = t.p;
++p->use;
}
Expr& operator = (const Expr& rhs)
{
rhs.p->use++;
if(--p->use == 0)
{
delete p;
p = NULL;
}
p = rhs.p;
return *this;

}

~Expr()
{
delete p;
}
};

class Expr_node
{
// friend ostream& operator << (ostream&,const Expr_node&);
friend class Expr;
int use;
public:
Expr_node():use(1){}
virtual void print(ostream& o)const =0;
virtual ~Expr_node(){}
};

//int node
class Int_node:public Expr_node
{
friend class Expr;
int n;

Int_node(int k):n(k){}
void print(ostream& o)const
{
o<< n;
}

};

// unary node
class Unary_node:public Expr_node
{
friend class Expr;
string op;
Expr opnd;

Unary_node(const string& a,Expr b):op(a),opnd(b){}
void print(ostream& o)const
{
o<<"("<<op<<*opnd<<")";
}
};

//Binary node
class Binary_node:public Expr_node
{
friend class Expr;
const string op;
Expr left;
Expr right;

Binary_node(const string& a,Expr b,Expr c)
{
op=a;
left=b;
right=c;
}
void print(ostream& o)const
{
o<<"("<<left<<op<<right<<")";
}


};

ostream& operator<<(ostream& o,const Expr& t)
{
t.p->print(o);
return o;
}

在main.cpp中,如下
#include<iostream.h>
#include"Expr_node.h"

int main()
{

Expr t =Expr("*",Expr("-",5),Expr("+",3,4));
cout<<t<<endl;
t = Expr("*",t,t);
cout<<t<<endl;
return 0;
}

可是总也找不到原因为什么编译不过去
请大家帮忙看看,谢谢了
...全文
391 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyanhun 2005-11-18
  • 打赏
  • 举报
回复
~Expr()
{
delete p;
};

看老是有问题的吧 ?
看来是用引用计数实现的,析构函数改为 :

~Expr()
{
if(--p->use==0)
delete p;
};
qhfu 2005-11-18
  • 打赏
  • 举报
回复
把类定义和实现分开。
goodyun82 2005-11-18
  • 打赏
  • 举报
回复
#include<string>
#include<ostream.h>
?????????????
NeuSoftRen 2005-11-18
  • 打赏
  • 举报
回复
对,我是在C++深思录上抄的;
我的系统是日文的,贴上错误估计是乱码
以下是错误
f:\programming practice\express\expr_node.h(20) : error C2629: 'class Expr (' ‚Í•s³‚Å‚·B
f:\programming practice\express\expr_node.h(20) : error C2334: '{' ‚Ì‘O‚É—\Šú‚µ‚È‚¢Ä°¸Ý‚ª‚ ‚è‚Ü‚µ‚½BŠÖ”‚Ì–{‘Ì‚Í–³Ž‹‚³‚ê‚Ü‚·
f:\programming practice\express\expr_node.h(25) : error C2629: 'class Expr (' ‚Í•s³‚Å‚·B
f:\programming practice\express\expr_node.h(25) : error C2334: '{' ‚Ì‘O‚É—\Šú‚µ‚È‚¢Ä°¸Ý‚ª‚ ‚è‚Ü‚µ‚½BŠÖ”‚Ì–{‘Ì‚Í–³Ž‹‚³‚ê‚Ü‚·
f:\programming practice\express\expr_node.h(83) : error C2146: \•¶´×° : ';' ‚ªAŽ¯•ÊŽq 'op' ‚Ì‘O‚É•K—v‚Å‚·B
f:\programming practice\express\expr_node.h(83) : error C2501: 'string' : Ž¯•Ê–¼‚ðéŒ¾‚·‚é‚̂ɁAŒ^‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñB
f:\programming practice\express\expr_node.h(83) : error C2501: 'op' : Ž¯•Ê–¼‚ðéŒ¾‚·‚é‚̂ɁAŒ^‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñB
f:\programming practice\express\expr_node.h(86) : error C2629: 'class Unary_node (' ‚Í•s³‚Å‚·B
f:\programming practice\express\expr_node.h(86) : error C2334: ':' ‚Ì‘O‚É—\Šú‚µ‚È‚¢Ä°¸Ý‚ª‚ ‚è‚Ü‚µ‚½BŠÖ”‚Ì–{‘Ì‚Í–³Ž‹‚³‚ê‚Ü‚·
f:\programming practice\express\expr_node.h(97) : error C2146: \•¶´×° : ';' ‚ªAŽ¯•ÊŽq 'op' ‚Ì‘O‚É•K—v‚Å‚·B
f:\programming practice\express\expr_node.h(97) : error C2501: 'op' : Ž¯•Ê–¼‚ðéŒ¾‚·‚é‚̂ɁAŒ^‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñB
f:\programming practice\express\expr_node.h(101) : error C2629: 'class Binary_node (' ‚Í•s³‚Å‚·B
f:\programming practice\express\expr_node.h(101) : error C2334: '{' ‚Ì‘O‚É—\Šú‚µ‚È‚¢Ä°¸Ý‚ª‚ ‚è‚Ü‚µ‚½BŠÖ”‚Ì–{‘Ì‚Í–³Ž‹‚³‚ê‚Ü‚·
f:\programming practice\express\main.cpp(7) : error C2661: 'Expr::Expr' : 2 ŒÂ‚̈ø”‚ðŽ‚Âµ°ÊÞ°Û°ÄÞ‚³‚ꂽŠÖ”‚Í‚ ‚è‚Ü‚¹‚ñB
f:\programming practice\express\main.cpp(7) : error C2661: 'Expr::Expr' : 3 ŒÂ‚̈ø”‚ðŽ‚Âµ°ÊÞ°Û°ÄÞ‚³‚ꂽŠÖ”‚Í‚ ‚è‚Ü‚¹‚ñB
f:\programming practice\express\main.cpp(7) : error C2661: 'Expr::Expr' : 3 ŒÂ‚̈ø”‚ðŽ‚Âµ°ÊÞ°Û°ÄÞ‚³‚ꂽŠÖ”‚Í‚ ‚è‚Ü‚¹‚ñB
f:\programming practice\express\main.cpp(7) : error C2512: 'Expr' : ¸×½A\‘¢‘́A‹¤—p‘Ì‚ÉÃÞÌ«ÙÄ ºÝ½Ä׸À‚ª‚ ‚è‚Ü‚¹‚ñB
f:\programming practice\express\main.cpp(9) : error C2661: 'Expr::Expr' : 3 ŒÂ‚̈ø”‚ðŽ‚Âµ°ÊÞ°Û°ÄÞ‚³‚ꂽŠÖ”‚Í‚ ‚è‚Ü‚¹‚ñB
cl.exe ‚ÌŽÀs´×°

Express.exe - ´×° 18AŒx 0
逸学堂 2005-11-18
  • 打赏
  • 举报
回复
贴出错误提示来吧
睡在床板下_ 2005-11-18
  • 打赏
  • 举报
回复
class 默认的是private不是 public ,friend ostream& operator<<(ostream& o,const Expr& t);为什么是 private??
是抄的把,不是自己写的???
codeDear 2005-11-18
  • 打赏
  • 举报
回复
"我的系统是日文的"BS
ddmor 2005-11-18
  • 打赏
  • 举报
回复
把头文件引用定义改成:
#include<string>
#include<iostream>
using namespace std;
不要使用iostream.h,那是以前老c++使用的头文件。
还有发现你类定义有循环引用定义的错误:
Int_node类从Expr_node派生,并且使用Expr类定义成员数据变量opnd;而Expr的构造函数中又调用Int_node的构造函数,所以,最后将Expr的构造函数的实现放到cpp中完成。
Expr(int n)
{
p = new Int_node(n);
}
Mr_Yang 2005-11-18
  • 打赏
  • 举报
回复
mark
逸学堂 2005-11-18
  • 打赏
  • 举报
回复
#include<string>
要用
using namespace::std;
不然
你这个更本无法使用
friend ostream& operator<<(ostream& o,const Expr& t);

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧