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;
}

 

转载于:https://www.cnblogs.com/simplewonder/p/4009981.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值