看板 C_and_CPP 關於我們 聯絡資訊
我所知道的就是 如果沒有把建構子解構子寫在 class外定義,compile會說 incomplete type 噴error 但我沒有很 明確的 可以說出為什麼 https://wandbox.org/permlink/CrPMjxcQmHmc10z0 vs https://wandbox.org/permlink/IXggjec3DzkQJlCk 上面的可以過。我只能用結果論推斷 include 在main 後 剛好他也看到了FooImpl的完整 size(雖然再後面才定義,為什麼沒噴eror??) “好像”是因為這樣才可以過. 另一個則 是 main include Foo.h 的時候還沒看到 FooImpl所以建構解構 產生的程式碼會需要com plete type 所以出問題,但如果這樣講 unique_ptr解構子會有具體呼叫delete ptr的動 作的我可以接受,建構子呢? new是caller new, 裡面應該只是做pointer的assign, 不 該出問題呀 ,但經過實驗 若建構子寫在class 內 也是會壞,為什麼呢 以上可否給我一些更具體的概念? 另一個問題是 我試圖用shared_ptr看有沒有這類問題,曾經看過網路上說也會遇到 , 但我做不出來, 再想是不是跟實作有關,我試圖跳進我的shared_ptr header....奇怪我找不到解構子 [1 ], 讓我不知怎麼理解...沒有解構子怎麼讓refcount --? 也許都包在control block那 物件但沒有深究,但這樣就能避免我一開始遇到的問題嗎?還是剛好實作是這樣 也許vc 就不一樣@@ 以上 想跟各位討論釐清 謝謝 [1] https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/sh ared_ptr.h -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.52.94.45 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1555983573.A.120.html
Jockey66666: Effective Modern C++這本書有提到 04/23 10:11
Jockey66666: 手邊沒書剛剛查了一下應該是條款22 04/23 10:12
sarafciel: 錯誤訊息給得很明確了 unique_ptr有一個預設的 04/23 12:09
sarafciel: default_delete模板 當它特化時裡面有放static_assert 04/23 12:10
sarafciel: 去檢驗incomplete type並擋掉 跟你的建構和解構的定義 04/23 12:13
sarafciel: 有沒有看到其實沒有關係 04/23 12:14
loveme00835: 你好像一直鬼打牆在同樣問題上 04/24 18:15