購物籃程式:模擬虛拷貝
1文字查詢程式(2):允許單詞的邏輯組合查詢如:fiery&bird|windclass
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
分析:我們只需要對於textquery,定義operator~(),operator|(textquery1,textquery2),operator&(textquery1,textquery2)即可完成任務。
我們這樣使用:textquery(fiery)&textquery(brid)|textquery(wind),會出現三個textquery物件。
邏輯上來講,文字文件物件textquery只需要乙個。其實,真正需要多個操作的是查詢這一操作。我們現在有必要將查詢這一操作分離出來。
之前的查詢是乙個函式[參見 chapter12&chapter13程式例項]:
47現在我們把它分離出來,重新寫作乙個類query,然後定義operator~,operator|,operator&即可。//如果沒有找到string,應該返回什麼?
48//
我們定義乙個區域性static物件,它指向乙個空行號set的shared_ptr,未找到單詞,則返回此物件的乙個拷貝
49 queryresult textquery::query(const
string &sought) const50;
56else
57return ;
58 }
但是書中為了演示繼承,所以把操作設計成繼承體系。
每個查詢類只包含兩個操作:
eval,接受乙個textquery物件,返回乙個queryresult;
rep,返回基礎查詢的string表示形式。
具體的類設計細節參見書本。
然後使用query類隱藏繼承體系。
所以query_base的所有函式都是私有的。(私有虛函式竟然可以被派生基類訪問?query不是notquery的友元,亦可以呼叫私有虛函式??)
1class
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 去除掉...