[問題] 關於 return reference

看板C_and_CPP作者 (檸檬子)時間10年前 (2014/05/19 12:27), 編輯推噓2(209)
留言11則, 4人參與, 最新討論串1/3 (看更多)
在設計類別的時候一般不會直接 return private member 的 reference, 而是提供 getter 和 setter,這是封裝上的考量。 但我現在有個類別設計上的疑慮,以下是個簡化的範例: class IDrive { public: virtual void run(void) = 0; }; class CDDrive: public IDrive { public: void run(void) { /* do something */ } }; class Computer { public: const IDrive& getDrive() const { return drive; } private: CDDrive drive; }; 現在我有個外部函式需要 IDrive 類別作為引數, void foo(IDrive &drive); 如果我直接呼叫 foo(computer.getDrive()); 編譯時會遇到 const 報錯。 想問一下這種情況應該要 return reference 嗎? 或是有其他更好的設計?謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.56.147 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1400473677.A.E37.html

05/19 12:39, , 1F
因為const IDrive& getDrive()回傳const reference
05/19 12:39, 1F

05/19 12:41, , 2F
但foo(IDrive &drive)想要的是non-const
05/19 12:41, 2F

05/19 14:31, , 3F
所以這種情況我應該要提供 non-const 和 const 兩個版本?
05/19 14:31, 3F

05/19 15:31, , 4F
或許 foo 的引數可以設計成 const IDrive &
05/19 15:31, 4F

05/19 15:32, , 5F
或是IDrive&&
05/19 15:32, 5F

05/20 13:33, , 6F
foo的引數const IDrive &drive是正解。如果foo會改變
05/20 13:33, 6F

05/20 13:34, , 7F
drive的話 那這設計可能要改一下
05/20 13:34, 7F

05/20 13:34, , 8F
嚴格一點的系統會要求getter只能是const & 這樣可能就
05/20 13:34, 8F

05/20 13:35, , 9F
只能傳入整個class讓他在裡面呼叫setter
05/20 13:35, 9F

05/20 13:35, , 10F
鬆散一點的話會宣告兩個getter 在鬆散一點的話會僅宣告
05/20 13:35, 10F

05/20 13:36, , 11F
non-const版本的getter. 我個人是偏好中庸之道 :D
05/20 13:36, 11F
文章代碼(AID): #1JUOXDut (C_and_CPP)
文章代碼(AID): #1JUOXDut (C_and_CPP)