class node { public: enum node_type { var_node, num_node, op_node } node(const node &); ~node(void); node & operator = (const node &); bool constant_fold(void); void print(ostream &) const; private: node_type nt; node * left, node * right; // for operators big_num val; // for numbers string name // for variables and ops };
void node::print(ostream & os) const { switch (ntype) { case op_node: left->print(os); os << " " << name << " "; right->print(os; break; case num_node: val->print(os); break; case num_node: os << name; break; default: cerr << "Unknown node type in node::print().\n"; exit(EXIT_FAILURE); } }
class node { public: virtual ~node() { } virtual void print(ostream * os) const { } virtual bool constant_fold(void) { return false; } };
class node { public: virtual ~node() = 0; virtual void print(ostream * os) const = 0; virtual bool constant_fold(void) = 0; };
class num_node : node { public: num_node(big_num & bn) : val(bn) { } void print(ostream & os) const { val->print(os); } bool constant_fold(void) { return true; } private: big_num val; }; class var_node : node { public: var_node(string & n) : name(n) { } void print(ostream & os) const { os << name; } bool constant_fold(void) { return false; } private: string name; }; class op_node : node { public: op_node(const string & o, node * l, node * r) : op(o), left(l), right(r) { } op_node(const op_node &) { } ~op_node(void) { /* Whatever */ } op_node & operator = (const op_node & on) { /* whatever */ } void print(ostream & os) const { left->print(os); os << " " << op << " " right->print(os); } bool constant_fold(void) { /* Whatever */ } private: const string op; node * left, * right; };
void try_commute(node * np) { op_node * onp = dymamic_cast<op_node *>(np); if (onp) onp->commute(); }
It could indicate a missed opportunity for subtype polymorphism.
This page last modified on 22 April 2002.