freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

輕量級(jí)的面向?qū)ο骳語(yǔ)言編程框架介紹(編輯修改稿)

2025-02-03 10:38 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 h 對(duì)象, Dog 對(duì)象,以及 Car對(duì)象均視為可移動(dòng)物體,均裝入 IMoveable 容器,然后用完全相同的方式調(diào)用 IMoveable 接口的 move 方法??吹搅藛??借助 LW_OOPC, 在 C 語(yǔ)言下 我們 竟然可以 輕松地 實(shí)現(xiàn) 面向?qū)ο蠛?面向接口編程! 下面,再舉一個(gè) 稍微 復(fù)雜的例子, 它的 覆 蓋面是足夠全面的,足以一瞥面向?qū)ο缶幊痰? 個(gè)要素:數(shù)據(jù)抽象、繼承和多態(tài)。 通過(guò)這個(gè)例子,我們 期望展現(xiàn) 出 LW_OOPC 在 遭遇問(wèn)題本身比較復(fù)雜的情形下, 是 如何從容應(yīng)對(duì) 的 , 以 加深 讀者對(duì) LW_OOPC 的認(rèn)識(shí)。 (備注:該問(wèn)題 來(lái)自《 C++沉思錄》第八章的例子,有興趣的讀者可以對(duì)照參閱) 問(wèn)題描述: 此程序涉及 的內(nèi)容是用來(lái)表示算術(shù)表達(dá)式的樹(shù)。例如,表達(dá)式( 5) *( 3+4)對(duì)應(yīng)的樹(shù)為: * + 5 4 3 一個(gè)表達(dá)式樹(shù)包括代表常數(shù)、一元運(yùn)算符和二元運(yùn)算符的節(jié)點(diǎn)。這樣的樹(shù)結(jié)構(gòu)在編譯 器和計(jì)算器程序中都可能用到。 我們希望能通過(guò)調(diào)用合適的函數(shù)來(lái)創(chuàng)建這樣的樹(shù),然后打印該樹(shù)的完整括號(hào)化形式 。例如,我們希望 include include int main() { Expr* expr1 = Expr_new()。 Expr* expr2 = Expr_new()。 Expr* expr3 = Expr_new()。 Expr* expr = Expr_new()。 expr1initUnaryX(expr1, , 5)。 expr2initBinaryX(expr2, +, 3, 4)。 expr3initBinary(expr3, *, expr1, expr2)。 exprinitBinary(expr, *, expr3, expr3)。 expr3print(expr3)。 printf(\n)。 exprprint(expr)。 printf(\n)。 Expr_delete(expr)。 Expr_delete(expr3)。 Expr_delete(expr2)。 Expr_delete(expr1)。 return 0。 } 打印 ((5)*(3+4)) (((5)*(3+4))*((5)*(3+4))) 作為輸出。此外,我們不想為這些表達(dá)式的表示形式操心,更不想關(guān)心有關(guān)它們內(nèi)存分配和回收的事宜。 這個(gè) 程序所做的事情在很多需要處理 復(fù)雜輸入的大型程序中是很典型的,例如編譯器、編輯器、 CAD/CAM 系統(tǒng)等。此類(lèi)程序中通常要花費(fèi)很大的精力 來(lái)處理類(lèi)似樹(shù)、圖和類(lèi)似的數(shù)據(jù)結(jié)構(gòu)。這些程序的開(kāi)發(fā)者永遠(yuǎn)需要面對(duì)諸如內(nèi)存分配、靈活性和效率之類(lèi)的問(wèn)題。面向?qū)ο蠹夹g(shù)可以把這些問(wèn)題局部化,從而確保今后發(fā)生的一系列變化不會(huì)要求整個(gè)程序中的其他各個(gè) 部分隨之做相應(yīng)調(diào)整。 解決方案: 通過(guò)考查這個(gè)樹(shù)結(jié)構(gòu),會(huì)發(fā)現(xiàn)這里有 3 種節(jié)點(diǎn)。一種表示整數(shù)表達(dá)式,包含一個(gè)整數(shù)值,無(wú)子節(jié)點(diǎn)。另外兩個(gè)分別表示一元表達(dá)式和二元表達(dá)式,包含一個(gè)操作符,分別有一個(gè)或兩個(gè)子節(jié)點(diǎn)。我們希望打印各種節(jié)點(diǎn),但是具體方式需要視要打印節(jié)點(diǎn)的類(lèi)型而定。這就是動(dòng)態(tài)綁定的用武之地了:我們可以定義一個(gè)虛函數(shù)( print)來(lái)指明應(yīng)當(dāng)如何打印各種節(jié)點(diǎn)。動(dòng)態(tài)綁定將會(huì)負(fù)責(zé)在運(yùn)行時(shí)基于打印節(jié)點(diǎn)的實(shí)際類(lèi)型調(diào)用正確的函數(shù)。 首先,我們抽象出“節(jié)點(diǎn)”的概念, 抽象類(lèi)的名字定為 Expr_node, 它提供了打印的抽象 接口,所有的實(shí)際節(jié)點(diǎn)類(lèi)型均從它派生: ABS_CLASS(Expr_node) { void (*print)(Expr_node* t)。 }。 具體類(lèi)的情形 怎樣?這些具體類(lèi)型中最簡(jiǎn)單的一類(lèi)是包含一個(gè)整數(shù),沒(méi)有子節(jié)點(diǎn)的節(jié)點(diǎn): CLASS(Int_node) { EXTENDS(Expr_node)。 int n。 void (*init)(Int_node* t, int k)。 }。 其他類(lèi)型又如何呢?每個(gè)類(lèi)中都必須存儲(chǔ)一個(gè)操作符(這倒簡(jiǎn)單,本文中假定 操作符最長(zhǎng)不超過(guò) 2 個(gè)字符,所以,可以用長(zhǎng)度為 3 的字符數(shù)組來(lái)保存),但是如何存儲(chǔ)子節(jié)點(diǎn)呢?在運(yùn)行時(shí)之前,我們并不知道子節(jié)點(diǎn)的類(lèi)型會(huì)是什么,所以我們不能按值存儲(chǔ)子節(jié)點(diǎn),必須存儲(chǔ)指針。這樣,一元和二元節(jié)點(diǎn)類(lèi)如下所示: CLASS(Unary_node) { EXTENDS(Expr_node)。 char op[3]。 //假設(shè)操作符最長(zhǎng)不超過(guò) 2個(gè)字符 Expr_node* opnd。 void (*init)(Unary_node* t, const char* a, Expr_node* b)。 }。 CLASS(Binary_node) { EXTENDS(Expr_node)。 char op[3]。 //假設(shè)操作符最長(zhǎng)不超過(guò) 2個(gè)字符 Expr_node* left。 Expr_node* right。 void (*init)(Binary_node* t, const char* a, Expr_node* b, Expr_node * c)。 }。 這個(gè)設(shè)計(jì)方案可以用,不過(guò)有一個(gè)問(wèn)題。用戶(hù)要處理的不是值,而是指針,所以 必須記住分配和 釋放對(duì)象。例如,我們需要這么創(chuàng)建表達(dá)式樹(shù): Int_node* int_node1 = Int_node_new()。 Int_node* int_node2 = Int_node_new()。 Int_node* int_node3 = Int_node_new()。 Unary_node* unary_node = Unary_node_new()。 Binary_node* binary_node1 = Binary_node_new()。 Binary_node* binary_node = Binary_node_new()。 int_node1init(int_node1, 5)。 int_node2init(int_node2, 3)。 int_node3init(int_node3, 4)。 unary_nodeinit(unary_node, , int_node1)。 binary_node1init(binary_node1, +, int_node2, int_node3)。 binary_nodeinit(binary_node, *, unary_node, binary_node1)。 lw_oopc_delete(int_node1)。 …… // 刪除創(chuàng)建的其他節(jié)點(diǎn) 也就是說(shuō),我們需要去關(guān)心每一個(gè)節(jié)點(diǎn)的創(chuàng)建和釋放。我們不僅把內(nèi)存管理這類(lèi)煩心事推給了用戶(hù),而且對(duì)用戶(hù)來(lái)說(shuō)也沒(méi)有什么方便的辦法來(lái)處理這些事情。我們得 好好 想想辦法了。 這里,提供一種解決內(nèi)存管理問(wèn)題的思路:引用計(jì)數(shù),這里是針對(duì)指針,對(duì)指針的狀況進(jìn)行計(jì)數(shù), 對(duì)象創(chuàng)建的時(shí)候,引用計(jì)數(shù)為 1, 凡是指針被賦值了,該指針?biāo)笇?duì)象的引用計(jì)數(shù)就自增一,每次指針要釋放, 都先檢查對(duì)象的引用計(jì)數(shù),讓引用計(jì)數(shù)自減一,如果引用計(jì)數(shù)為 0,則釋放該對(duì)象。 另外,原先的設(shè)計(jì)不夠高層,用戶(hù)只能直接針對(duì)節(jié)點(diǎn)進(jìn)行操作,沒(méi)有提供操作子樹(shù)的概念 (這也是用戶(hù)代碼之所以復(fù)雜的原因之一) ,我們發(fā)現(xiàn),通過(guò)提供子樹(shù)的概念, 我們 不但能夠隱藏 Expr_node 繼承層次,而且,對(duì)于每一個(gè)節(jié)點(diǎn),我們具備了操縱左子樹(shù)和右子樹(shù)的能力(原來(lái)只能操作左子節(jié)點(diǎn)和右子節(jié)點(diǎn))。而這種功能增強(qiáng)完全是建立在面向?qū)ο蟮臋C(jī)制之上,我們并沒(méi)有引入耦合,在非常自然和輕松的情形下,我們獲得了更好的軟件組件之間協(xié)作的能力,這正是面向?qū)ο蟮镊?力所在。 這里,我們把子樹(shù)的概念用類(lèi) Expr 來(lái)表示,由于子樹(shù)此時(shí)成了 Expr_node 具體類(lèi)的成員,同樣,左右子樹(shù)在 Expr_node 中同樣是以指針的方式保存,所以,對(duì) Expr 也需要進(jìn)行引用計(jì)數(shù),代碼直接貼上來(lái),細(xì)節(jié)解說(shuō)參見(jiàn)注釋?zhuān)? // ifndef EXPR_H_INCLUDED_ define EXPR_H_INCLUDED_ include // 表達(dá)式節(jié)點(diǎn) ABS
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1