Chapter15 程式例項

2022-05-03 17:36:07 字數 3832 閱讀 3959

購物籃程式:模擬虛拷貝

1

class

basket29

double total_recipt(ostream& os) const

1016}17

private:18

static

bool compare(shared_ptr&lhs, shared_ptr&rhs)

1922 multiset, decltype(compare)*>items;

2324

};25

26//

使用方法

27basket bsk;

28 bsk.add_item(make_shared("

123", 45

));29 bsk.add_item(make_shared("

345", 45,3,15

));30

31//

我們想這麼使用,即:add_item負責記憶體的分配與管理

32 bsk.add_item(quote("

123", 45

));33 bsk.add_item(bulk_quote("

345", 45, 3, 15

));34

35//

問題是,我們無法通過引數的型別quote,來得知應該分配什麼樣的記憶體,quote or bulk_quote?

36//

解決方法:模擬虛拷貝

37class

quote

3841

virtual quote* clone() &&

42};

43class bulk_quote:public

quote

4447

virtual bulk_quote* clone() &&

48};

4950

void add_item(const quote &sale)

5154

void add_item(quote &&sale)

55

文字查詢程式(2):允許單詞的邏輯組合查詢如:fiery&bird|wind

分析:我們只需要對於textquery,定義operator~(),operator|(textquery1,textquery2),operator&(textquery1,textquery2)即可完成任務。

我們這樣使用:textquery(fiery)&textquery(brid)|textquery(wind),會出現三個textquery物件。

邏輯上來講,文字文件物件textquery只需要乙個。其實,真正需要多個操作的是查詢這一操作。我們現在有必要將查詢這一操作分離出來。

之前的查詢是乙個函式[參見 chapter12&chapter13程式例項]:

47

//如果沒有找到string,應該返回什麼?

48//

我們定義乙個區域性static物件,它指向乙個空行號set的shared_ptr,未找到單詞,則返回此物件的乙個拷貝

49 queryresult textquery::query(const

string &sought) const50;

56else

57return ;

58 }

現在我們把它分離出來,重新寫作乙個類query,然後定義operator~,operator|,operator&即可。

但是書中為了演示繼承,所以把操作設計成繼承體系。

每個查詢類只包含兩個操作:

eval,接受乙個textquery物件,返回乙個queryresult;

rep,返回基礎查詢的string表示形式。

具體的類設計細節參見書本。

然後使用query類隱藏繼承體系。

所以query_base的所有函式都是私有的。(私有虛函式竟然可以被派生基類訪問?query不是notquery的友元,亦可以呼叫私有虛函式??

1

class

query_base2;

1112

class

query

1320

string rep() const

21private

:22 query(shared_ptrquery) :q(query) {}

23 shared_ptrq;

24};

2526 ostream& operator

<

2730

3132

//query_base的繼承體系

33class wordquery :public

query_base

3437 queryresult eval(const textquery &t) const

38string rep() const

39string

query_word;

40};

41//

注意,query只是query_base和wordquery的友元

42 inline query::query(const

string &s)

43 :q(new

wordquery(s)) {}

4445

46class notquery :public

query_base

4750

string rep()const

51 queryresult eval(const textquery&) const;52

query query;

53};

5455 inline query operator~(const query &oprand)

5659

60class binaryquery :public

query_base

6166

string rep() const

67query lhs, rhs;

68string

opsym;

69};

7071

class andquery :public

binaryquery

7276 queryresult eval(const textquery&) const;77

};78

79 inline query operator&(const query &lhs, const query &rhs)

8083

84class orquery :public

binaryquery

8589 queryresult eval(const textquery&) const;90

};91

92 inline query operator|(const query &lhs, const query &rhs)

9396

97 queryresult orquery::eval(const textquery &text) const

98105

106 queryresult andquery::eval(const textquery &text) const

107115

116 queryresult notquery::eval(const textquery &text) const

117129

130return

queryresult(rep(), ret_lines, result.get_file());

131 }

Chapter 15 程序間通訊

純屬抄書。cry size large ipc interprocess communication 管道 pipe 大多是半雙工,程序族裡應用 fifo命名管道 mkfifo 不同程序,是一種檔案型別。訊息佇列 queue 訊號量 semaphore 與123不同,是乙個計數器,用於多程序共享資料...

Chapter15 抽象工廠模式

抽象工廠模式 abstract factory 提供乙個建立一些列相關或相互依賴物件的介面,而無需指定它們具體的類。優點 1.易於變換產品系列,由於具體工廠類,在乙個應用中只需要初始化一次,這就使得改變乙個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。2.它讓具體的建立例項...

chapter 15 深度學習的硬體與方法

目前cnn rnn等神經網路已經有了長足的發展,但它由於結構太過複雜,導致體積 對算力的要求以及能耗都大幅提高。在開始之前,先簡單了解下硬體的基礎知識 關於推斷的介紹,可見 我的理解是,推斷可以理解為應用。在訓練好神經網路後,部署到裝置上後,裝置執行的過程,稱為推斷。一 剪枝 pruning 去除掉...