[問題] unique_ptr + pimpl 建構子解構子

看板C_and_CPP (C/C++)作者 (JOMI)時間7年前 (2018/09/26 12:10), 編輯推噓1(1011)
留言12則, 4人參與, 7年前最新討論串1/1
看了一些文章“大概“知道pimpl+uniqueptr為什麼要把解構子宣告跟定義要分開 因為沒分開 compiler會gen code然後用到 deleter 間接需要 看到complete type 於是就做了一些實驗,然後就發現有些無法理解的地方 https://wandbox.org/permlink/QRaV5jfUA5wKgE4c 1. 這邊故意讓建構子定義不分開,就編譯不過. 不知道為什麼會去碰到deleter 我建構 子也沒刻意去new Foo https://wandbox.org/permlink/GZwtpA8GUuilcGXP vs https://wandbox.org/permlink/DLCA2r2aXsg3MJ3f 都是把main用到Bar b; 遮掉 差異在 Bar.h內 ~Bar() = default; vs ~Bar() {} 原本以為這兩個是幾乎等價的寫法 但似乎還是有差距 2. 但我不理解為什麼一個build的過一個不行? 最後又好奇的做一個實驗 基於以下會build error https://ideone.com/vVQAbv 我試著把 class Foo{}; 定義在 Bar::Bar(){} and ~Bar(){} 下面 https://wandbox.org/permlink/vkPvz0rcMblhC8O9 竟然也build過了!? 3. 為什麼這樣不會說undecalre error. 其實寫code常常會遇到類似這種問題, 明明覺得 應該會build failed(因為宣告順序問題) 但莫名其妙沒error, 一時之間找不到例子, 有些情況發生在template, 但似乎有個"t wo phase name lookup", 但這邊又不是template? 4. 也許都不用管太多, 是不是最正規的寫法就是 class內有unique_ptr 好習慣就是 建 構解構定義在class外, 但總覺得寫出 Bar::~Bar() = default; 一定會被問說怎麼不放在class裡面 或是直 接刪除不寫. 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.9.226.34 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1537935000.A.F87.html

09/26 13:36, 7年前 , 1F
把解構子寫出來不就沒事了,還有去搞懂何謂前置宣告
09/26 13:36, 1F

09/26 15:02, 7年前 , 2F
?有寫啊
09/26 15:02, 2F

09/26 23:45, 7年前 , 3F
可以分享一下你提到 Pimpl + unique_ptr 的文章嗎?
09/26 23:45, 3F

09/26 23:46, 7年前 , 4F
我有點搞不懂,根據 Rule of Zero不是連 dtor 都不該
09/26 23:46, 4F

09/26 23:47, 7年前 , 5F
出現嗎?
09/26 23:47, 5F

09/27 00:00, 7年前 , 6F
oops 當我沒說,default 也是符合rule of zero
09/27 00:00, 6F

09/27 09:11, 7年前 , 7F
09/27 09:11, 7F

09/27 13:26, 7年前 , 8F
因此錯在於你隱藏的不夠確實,解構子也要放在cpp那邊
09/27 13:26, 8F

09/27 17:11, 7年前 , 9F
現在是建構子為什麼也必須在那,還有其他問題
09/27 17:11, 9F

09/27 17:31, 7年前 , 10F
@adrianshum 請問default 也滿足rule of zero 是哪裡的
09/27 17:31, 10F

09/27 17:31, 7年前 , 11F
規定呢 謝謝
09/27 17:31, 11F

09/27 20:00, 7年前 , 12F
你可以去看effective modern C++裡面有大略講
09/27 20:00, 12F
文章代碼(AID): #1RgmQO-7 (C_and_CPP)
文章代碼(AID): #1RgmQO-7 (C_and_CPP)