首页 > 代码库 > C++沉思录第8章程序,正确运行
C++沉思录第8章程序,正确运行
#include <iostream>#include <string>using namespace std;class Expr_node{ //friend ostream& operator<<(ostream&, const Expr_node&); friend class Expr;private: int use;public: Expr_node(): use(1) { } virtual void print(ostream&) const = 0; virtual ~Expr_node() { }};/*ostream& operator<<(ostream& o, const Expr_node& e){ e.print(o); return o;}*/class Expr{ friend ostream& operator<<(ostream&, const Expr&);private: Expr_node *p;public: Expr(int); Expr(const string&, Expr); Expr(const string&, Expr, Expr); Expr(const Expr&); Expr& operator=(const Expr&); ~Expr() { if(--p->use==0)delete p; }};class Int_node: public Expr_node{ friend class Expr; int n; Int_node(int k): n(k) { } void print(ostream &o) const { o << n; }};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 << ")";}};class Binary_node: public Expr_node{ friend class Expr; 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 << ")";}};Expr::Expr(int n) { p = new Int_node(n); }Expr::Expr(const string& op, Expr t) { p = new Unary_node(op, t); }Expr::Expr(const string& op, Expr left, Expr right){ p = new Binary_node(op, left, right);}Expr::Expr(const Expr& t){ p = t.p; ++p->use;}Expr& Expr::operator=(const Expr& rhs){ rhs.p->use++; if(--p->use == 0){ delete p; } p = rhs.p; return *this;}ostream& operator<<(ostream& o,const Expr& t){ (t.p)->print(o); return o;}int main(){ Expr t = Expr("*", Expr("-",5), Expr("+", 3, 4)); cout << t << endl; return 0;}
C++沉思录第8章程序,正确运行
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。