《C 沉思錄》 第八章 乙個物件導向程式範例

2021-06-19 15:26:58 字數 1918 閱讀 1771

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 ...