《物件導向程式設計》課程作業七

2022-03-09 02:07:47 字數 1685 閱讀 8761

題目描述

請將隨機生成數字、表示式的部分設計成:乙個random基類,基類中有random()方法。並由該基類派生出randomnumber類、randomoperation類,繼承並覆蓋父類方法。

學習簡單工廠模式,思考能否將該模式運用到題目的第一點要求中。

#include#includeusing namespace std;

class random

virtual void random() = 0;

};unsigned int random::seed = (unsigned int)time(null);

void random::next()/*每次隨機後讓種子變成乙個新的*/

class randomnum : public random

virtual void random();

int getnum()

};void randomnum::random()

class randomoper : public random

virtual void random();

char getoper()

};void randomoper::random()

next();

}int main()

工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定的資訊,決定究竟應該建立哪個具體類的物件.通過使用工廠類,外界可以從直接建立具體產品物件的尷尬局面擺脫出來,僅僅需要負責「消費」物件就可以了。而不必管這些物件究竟如何建立及如何組織的.明確了各自的職責和權利,有利於整個軟體體系結構的優化。

工廠根據乙個字串來生成數字or運算子。

class randomfactory

;random * randomfactory::creatrandom(const int & s)

if (s == "operator")

else

return null;

}

其餘的部分邏輯相似,不貼了。

我想到我學c#時,覺得c#自帶的random類特別方便。先建立乙個random類的物件比如rnd,然後就可以rnd.next(int n) 生成乙個隨機數。

因為還要隨機生成運算子,就用了模板。

一開始我還傻乎乎的以為很好寫,就像下面這樣:

這肯定是不行的,經過搜尋,實現這樣的功能要用到類模板特化的知識點。看看我的類宣告:

templateclass random ;
如果你傳int引數進去,next方法就生成乙個隨機數,如果你傳的是char,那麼生成乙個運算子。

但對於nextseed方法,我們不希望將其特化,因為無論對於那種型別,nextseed的行為都希望是一樣的。這就涉及到類模板的成員函式的特化。寫的時候報錯無數,看文件也學到了不少,在**中也注釋了方便以後重看時回憶。

github上是簡單繼承和模板特化的兩個寫法。下圖是實現了c#寫法的效果:

編譯器報錯文件:

2017《物件導向程式設計》課程作業七

有乙個隨機類作為基類,隨機數類和隨機符號類繼承基類,各自增加保護成員隨機數和隨機符號,後在各自的random 方法中對隨機數和隨機符號賦值。隨機表示式類通過保護繼承的方式繼承隨機數類和隨機符號類,在random 方法中將隨機數和隨機符號組合成隨機表示式。使用時需要新建乙個randomexpressi...

2017《物件導向程式設計》課程作業七

題目描述 expression.cpp define random a,b rand b a 1 a class random class randomnumber public random int random int down,int up return random down,up clas...

《物件導向程式設計》課程作業八

emmm.轉眼又到學期末了。從寒假到這次結束,經歷的部落格及編碼作業的過程 時間過得好快啊,過年的時候在家裡用草稿紙上寫著函式原型和功能分塊,和朋友討論具體實現的細節 感覺寒假就在昨天一樣。部落格的話,不僅僅寫了這次作業,還積累了很多別的東西,這份收穫是可喜的。這次編碼是把所學知識做了一次真實的應用...