请能者解答:读C++大师Andrew Koenig>时产生的一点疑问

第八章“一个面向对象的范例” 范例是关于 +,-,*,/等数学表达式的处理。 程序如下:(C++Builder6.0 build 通过,运行不对。书内程序用明显少数字符错误,已改。) #include class Expr; class Expr_node { friend ostream& operator << ( ostream&, const Expr& ); friend class Expr; int use; protected: Expr_node(): use(1) {} virtual ~Expr_node() { } virtual void print( ostream& ) const = 0; }; //----------------------------------------------------- class Expr { friend ostream& operator << ( ostream&, const Expr& ); Expr_node * p; public: Expr( int ); Expr( const string&, Expr ); Expr( const string&, Expr, Expr ); ~Expr() { delete p; } public: Expr( const Expr& t ) { p = t.p; ++p->use; } Expr& operator = ( const Expr& t ); }; //---------------------------------------------------- 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 << ")"; } }; ostream& operator << ( ostream& o, const Expr& t ) { t.p->print( o ); return o; }; 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::operator = ( const Expr& rhs ) { rhs.p -> use++; if ( --p->use == 0 ) delete p; p = rhs.p; return *this; }; //-------------------------------------------------- void main() { // Expr t = Expr( "*", Expr( "-", 5 ), Expr( "+", 3, 4 )); // Expr t0 = Expr( 123 ); cout << t0 << endl; Expr t00( 5 ); cout << t00 << endl; // 此例可以。 Expr t01( "-", t00 ); //不行 // t00 = Expr( "-", t00 ); // cout<<"sfsfsffs"<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值