體驗物件導向 計算器篇

2021-05-28 00:02:37 字數 2358 閱讀 8561

剛開始看程杰大佬的《大話設計模式》

感覺以前真的是空學了物件導向

拿著物件導向的利器(c++) 去做一些面向過程的東西

(當然不是說面向過程不好)

看到計算器篇之後馬上動手除錯

結果本來以為很簡單的東西讓我糾結了兩天

首先是思想

以前在書本上看過

物件導向的優點是

便於維護 便於更改

容易增加介面等等

從來沒有體驗過

結果自己設計

好傢伙設計了基類裡面有乙個虛函式

結果編譯的時候發現了這麼乙個錯誤

undefined reference to vtable for ***

第一次知道原來有虛函式的類裡面會有vtable

一開始沒網 又不是語法錯誤 糾結我半天

原來我在基類裡面只宣告了虛函式卻沒定義。。。

解決辦法兩鐘

1是定義

2是純虛函式

想想也對 我的基類裡面有的是兩個運算元

從現實的語義來說 並不需要例項(物件)

那就用純虛函式吧

這一來 純虛函式的繼承又忘了 也怪c++學的不咋滴 又到處翻課本

等出了乙個加法子類以後又傻眼了

雖然知道程老說寫乙個工廠類

不過腫麼實現純虛基類呢 又開始糾結

csdn 就是牛人雲集

找到了《大話設計模式》的c++實現版**

裡面的coperation *oper;

oper=new addoperation();

讓我深受啟發

指標啊萬能的指標

重新翻課本看到這三句話

1 子類物件可以隱含轉換為父類物件

子 = 父

2 子類物件可以初始化父類引用

父 &a = 子

3 子類物件位址(指標)可以轉換為父類指標

*父(指標) = *子(指標)

上面不就是用到第三條麼!!!

看來純虛函式是通過指標來實現的

學習了學習了

不過腫麼實現又是問題

乙個資料基類 和加減乘除各種運運算元類

腫麼在運算時選擇哪個子類

多型腫麼實現??

傳說中的**工廠?

第一次設計想把**工廠再通過各種運算類繼承下來

想想不好

為什麼呢?

因為如果這麼寫的話 以後要是再增加開方冪等別的介面

這個**工廠還有在繼承他們而且**工廠內部可能還要大換血

所以繼承關係不是很好的選擇

那就用依賴關係吧

╮(╯▽╰)╭ 問題又來了

one = operationfactoryt::operate(numa,numb,ch);

在我用上面這句的時候

編譯器告訴我operationfactoryt

木有物件

坑爹啊!!!

都快寫好了好不好

看看人家的**吧

發現他的**工廠類裡有乙個static

靜態成員函式啊!!!

ok 編譯通過 執行正確

╮(╯▽╰)╭

#include using std::cout;

using std::endl;

using std::cin;

class datat

;datat::datat()

datat::datat(datat &temp)

datat::~datat(){}

void datat::setnuma(double temp)

double datat::getnuma()

void datat::setnumb(double temp)

double datat::getnumb()

class addt:public datat

;double addt::getresult()

class subt:public datat

;double subt::getresult()

class mult:public datat

;double mult::getresult()

class divt:public datat

;double divt::getresult()

class operationfactoryt

;datat* operationfactoryt::operate(double numa, double numb, char ch)

temp->setnuma(numa);

temp->setnumb(numb);

return temp;

}int main()

return 0;

}

物件導向計算器(五)

主要是為了更正之前的設計缺陷 1 算術表示式解析器的乙個缺陷在於它的語法是右結合的。這意味著8 2 1被解析為8 2 1 2 可以通過更正語法 expresion expresion term 但這會導致無限迴圈 expr呼叫expr,expr又呼叫expr 3 一種解決方法 更改後的類圖 在程式中...

物件導向版計算器 八

讓表示式計算器支援變數賦值 新增幾個方法 主要用來確定賦值運算子 class node private noncopyable virtual void assign double virtual node 儲存變數class variablenode public node double calc...

物件導向編寫乙個計算器

首先分析計算器有加減乘除,取模,求餘等計算方式,所以我們在建立了這個類的同時就應該想到後期肯定需要進行這方面的擴充套件,所以在設計的時候就應該盡量不修改原有 的前提下進行功能的擴充套件,也就是降低物件之間的耦合度。廢話不多說,如下 namespace program public print dec...