Re: [問題] 多型的自動回收

看板C_and_CPP (C/C++)作者 (CA)時間16年前 (2009/10/07 01:31), 編輯推噓6(608)
留言14則, 4人參與, 最新討論串4/13 (看更多)
OK, 也許我描述得不夠清楚, 現在綜合兩篇的內容 class Base { public: void open() { // ... this->doOpen(); // ... this->opening_ = true; } void close() { // ... this->doClose(); // ... this->opening_ = false; } virtual ~Base() { // this->close(); assert( !this->opening_ ); } private: virtual void doOpen() = 0; virtual void doClose() = 0; bool opening_; }; class Derived { virtual void doOpen() {} virtual void doClose() {} }; ==== 我就是希望在 Base 這個層級就能在解構時自動回收 但是礙於 destructor 內不能呼叫 virtual function 目前我只有檢查 flag 我只想問在這個狀況下有沒有比較好的做法 -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.49.38

10/07 02:20, , 1F
什麼叫做"在 Base 這個層級就能在解構時自動回收"
10/07 02:20, 1F

10/07 02:21, , 2F
如果Derived::doClose()的內容也要使用者自己填
10/07 02:21, 2F

10/07 02:21, , 3F
那我覺得叫使用者再多填一個destructor並不過分
10/07 02:21, 3F

10/07 10:22, , 4F
Derived open出來的資源,當然是要在Derived的destructor
10/07 10:22, 4F

10/07 10:23, , 5F
處理啊@@ 你現在是希望Base的dtor可以幫Derived回收資源
10/07 10:23, 5F

10/07 12:56, , 6F
如果一定想用這個順序, 建議你不要在 destruct 的時候再做
10/07 12:56, 6F

10/07 12:57, , 7F
另外訂個 (non-virtual) void Release() 去 call doClose()
10/07 12:57, 7F

10/07 12:58, , 8F
然後在 destruct 之前手動 release...
10/07 12:58, 8F

10/07 13:50, , 9F
應該說我希望 Base 會確保一定會呼叫到 close 吧
10/07 13:50, 9F

10/07 13:52, , 10F
因為我是用 Factory 包 shared_ptr<Base>丟回Derived
10/07 13:52, 10F

10/07 13:53, , 11F
當shared_ptr在delete Base時,我希望它確保close有
10/07 13:53, 11F

10/07 13:54, , 12F
被呼叫到。@scwg 那就是Base::close 在做的事
10/07 13:54, 12F

10/07 15:32, , 13F
...那不就在Dtor裡明確呼叫Base::close()就好了嗎
10/07 15:32, 13F

10/07 15:37, , 14F
欸不對我看錯了 close裡還有個virtual fucntion call
10/07 15:37, 14F
文章代碼(AID): #1AotxdDu (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AotxdDu (C_and_CPP)