Re: [問題] 問一段code (virtual function)

看板C_and_CPP作者 (-858993460)時間14年前 (2012/01/21 11:28), 編輯推噓7(7015)
留言22則, 10人參與, 最新討論串2/2 (看更多)
※ 引述《neville123 (nk)》之銘言: : virtual void *emitFunctionStub(const Function* F, void *Target, : JITCodeEmitter &JCE) { : assert(0 && "This target doesn't implement emitFunctionStub!"); : return 0; : } : 最近在看code的時候, 覺得這段很奇怪, 想請問為什麼function body裡面什麼都沒做呢? : 因為他傳了一些參數進來不是嗎? 另外也想問一下 assert以字串當作參數是什麼用法呢? : 謝謝~ 1. 這裡的關鍵字是 virtual 也就是說這個 class 的設計者期望對它的使用是繼承下來 把這個函式實作起來才拿來用 因此寫成這樣 當繼承它的人沒有實作時就會噴出這個錯誤訊息出來 2. assert 這裡其實不是拿字串當作參數 注意到前面有個 0 && 你可以當成 false && 因此這個 assert 一定失敗 也就是在 debug build 當中執行到這一行就會炸給你看 之所以要寫個字串在那裡的原因是 assert 失敗時會吐出你是什麼式子判斷失敗 (而且是原文照搬; 內部使用的技巧我在 #1EV01Wpd 這篇說過, 這裡表過不提) 因此當在這裡炸掉時你就會炸掉的訊息當中看到類似 assert failed: 0 && "This target doesn't implement emitFunctionStub!" 這樣的文字 於是你就可以很清楚問題出在這裡 3. 所以雖然我個人偏好把這個函式寫成 pure virtual 強制使用者實作 (以此例來說就是 virtual void *emitFunctionStub(const Function* F, void *Target, JITCodeEmitter &JCE) = 0; 寫成這個樣子, 而且這樣當沒實作的時候一編譯就會炸掉, 不用到執行) 但這種寫法也不失為是一個提醒使用者的方式就是了 -- 'Oh, Harry, don't you see?' Hermione breathed. 'If she could have done one thing to make absolutely sure that every single person in this school will read your interview, it was banning it!' ---'Harry Potter and the order of the phoenix', P513 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.230.62

01/21 11:33, , 1F
也就是說這個function只是種概念 實際做法必須讓使用
01/21 11:33, 1F

01/21 11:33, , 2F
者自己來實作是吧?!
01/21 11:33, 2F

01/21 11:46, , 3F
你可以查一下oo的interface會更清楚
01/21 11:46, 3F

01/21 12:49, , 4F
可以請問一下樓上關鍵字嗎?
01/21 12:49, 4F

01/21 13:15, , 5F
XD 就 oo interface阿
01/21 13:15, 5F

01/21 13:47, , 6F
XD" 謝謝幾位
01/21 13:47, 6F

01/21 15:58, , 7F
我覺得寫這段程式碼的人根本不知道有 pure virtual
01/21 15:58, 7F

01/21 15:59, , 8F
function, 或者本來應該要實作的東西他忘了
01/21 15:59, 8F

01/21 16:02, , 9F
我一開始看到的第一個想法是他只是還沒寫上去XD
01/21 16:02, 9F

01/21 16:26, , 10F
所以如果要印出訊息就是 assert(0 && "...") ?
01/21 16:26, 10F

01/21 16:27, , 11F
還是 assert(!"...") 也可以嗎??
01/21 16:27, 11F

01/21 16:27, , 12F
實驗後者好像是對的
01/21 16:27, 12F

01/21 17:19, , 13F
@applecool: 如果你確定 "...." 不是傳回NULL才可如此.
01/21 17:19, 13F

01/21 18:42, , 14F
而且 0 && 應該會速度快一點? (short-circuit 的關係)
01/21 18:42, 14F

01/21 20:03, , 15F
實作Composite Pattern時可能用到這種寫法,例如Folder
01/21 20:03, 15F

01/21 20:05, , 16F
和File同樣繼承Entry,但File沒有Entry中Folder所需的
01/21 20:05, 16F

01/21 20:06, , 17F
getChildren(),因此讓留一個預設實作讓File.getChildren(
01/21 20:06, 17F

01/21 20:07, , 18F
)自爆,類似Java擲出OperationNotSupportedException
01/21 20:07, 18F

01/21 20:44, , 19F
樓上說的不是問題,可以 ret this等等,只是手法不同
01/21 20:44, 19F

01/23 01:36, , 20F
Thank you!
01/23 01:36, 20F

01/23 19:23, , 21F
@loveme00835 他不寫成pure virtual是想留下彈性
01/23 19:23, 21F

01/23 19:24, , 22F
我不會呼叫到 所以不實做很合理阿XD
01/23 19:24, 22F
文章代碼(AID): #1F6Z3i1_ (C_and_CPP)
文章代碼(AID): #1F6Z3i1_ (C_and_CPP)