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

来源:互联网 发布:mac命令行快捷键 编辑:程序博客网 时间:2024/05/18 01:06
第八章“一个面向对象的范例” 范例是关于 +,-,*,/等数学表达式的处理。程序如下:(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"<
  • 请能者解答:读C++大师Andrew Koenig>时产生的一点疑问
  • [美]Andrew Koenig -C陷阱与缺陷 - 更新顺序文件
  • [美]Andrew Koenig -C陷阱与缺陷 - 整数溢出
  • Andrew Koenig&Barbara Moo
  • 三个C的疑问寻求解答
  • 关于js中document.write一点疑问的解答
  • Andrew Koenig 的一些建议 C++沉思录
  • c 语言内部函数的一点疑问
  • C程序疑问解答 ——可怕的野指针
  • 数据库的一点疑问
  • ofstream 的一点疑问
  • 关于C++中 is a概念的一点疑问,希望高手解答。
  • 现阶段的css疑问解答
  • 常见的Angular疑问解答
  • spi一些疑问的解答
  • 句柄-摘自《C++沉思录》Andrew Koenig
  • 泛型迭代器-摘自《C++沉思录》Andrew Koenig
  • 库-摘自《C++沉思录》Andrew Koenig
  • 最新JavaScript炸弹!(把代码复制在地址栏上玩也可以炸死你!)
  • 华为的国际化逻辑:走出去就是机会
  • 2005-3-25
  • 深入探索Javascript对象机制
  • 流水
  • 请能者解答:读C++大师Andrew Koenig>时产生的一点疑问
  • 一个简单批处理病毒让你了解计算机病毒的基本原理!
  • 局域网查看工具V1.60.exe与局域网助手(LanHelper)的试用
  • Smart Client Case Study Source Code Download from MSDN China
  • 彩云在南,本命年在北(记云南之旅)
  • ASP获取数据库表名,字段名以及对字段的一些操作
  • CVSNT用户管理方案
  • 第四次编程练习:字符串编程,将字符串S中出现的子串T1用字符串T2替代。
  • 资料:Linux Device Driver 编写方法
  • 原创粉丝点击