node.h
#ifndef node_h
#define node_h
#include "expr.h"
#include #include using namespace std;
class expr_node
virtual ~expr_node() {}
virtual void print(ostream&) const = 0;
private:
int use;
friend class expr;
friend ostream& operator <<(ostream& o, const expr_node& e);
};class int_node: public expr_node
private:
friend class expr;
int n;
void print(ostream& o) const
};class unary_node: public expr_node
private:
string op;
expr opend;
void print(ostream& o) const
friend class expr;
};class binary_node: public expr_node
private:
void print(ostream& o) const
friend class expr;
string op;
expr left;
expr right;
};#endif // node_h
expr.h
#ifndef expr_h
#define expr_h
#include #include using namespace std;
class expr_node;
//控制代碼類
class expr
;#endif // expr_h
expr.cpp
#include "expr.h"
#include "node.h"
expr::expr(int data)
expr::expr(const string& op, expr e)
expr::expr(const string& op, expr a, expr b)
expr::expr(const expr& e)
expr::~expr()
}expr& expr::operator=(const expr& rhs)
p = rhs.p;
return *this;
}ostream& operator<<(ostream& o, const expr& e)
main.cpp
#include #include "expr.h"#include using namespace std;
int main()
{ expr t = expr("*", expr("-", 5), expr("+", 3, 4));
cout << t << endl;
t = expr("*", t, t);
cout << t 《輸出:
((-5)*(3+4))
(((-5)*(3+4))*((-5)*(3+4)))
以上**可以讓使用者自由地宣告expr型別的物件和臨時物件。並且可以構造任意複雜的表示式,列印他們,而無需考慮記憶體管理的問題。
寫這段**也是一波三折啊。
詳見:
C 沉思錄第八章算數表示式樹的物件導向問題的分析
剛開始看沉思錄,覺得太枯燥。到了第八章,作者關於物件導向問題的分析,我follow書上的設計開發,理解了一些以前只是在書上看到的概念。給自己做幾點註解吧 1.虛基類用來表達所有的繼承類的共有特點,在這個例子中,所有的繼承類都要有輸出和求值計算,所以我們把這兩個函式定義為虛函式。2.虛基類必須至少含有...
第八章 乙個創造奇蹟的公式
我們要記住,當對方並不承認有錯誤時,你別斥責他是錯誤的。在這種情形下,可能祇有愚蠢的人,才會去責備人家,聰明的人決不會如此,他會試著去了解對方,去原諒對方。為什麼這個人有那樣的思想和行動,一定有他的理由。我們探求出那個隱藏著的理由來,對他的行動 人格,就可以很清楚的了解了。你把自己處在他的情況下,你...
第八章 乙個畫線的封裝事例
兩者的區別就是,乙個是複製乙份,乙個是建立乙個指向property.函式的乙個指標 下面我們看乙個畫線的事例.這裡大家可以開啟我的另一篇文章 js畫線 快捷通道 整個函式的結構 function h5.divline function d,c,r h5.divline.prototype.line ...