作者wowslr (檸檬子)
看板C_and_CPP
標題[問題] 關於 return reference
時間Mon May 19 12:27:54 2014
在設計類別的時候一般不會直接 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
推 kwpn:因為const IDrive& getDrive()回傳const reference 05/19 12:39
→ kwpn:但foo(IDrive &drive)想要的是non-const 05/19 12:41
→ wowslr:所以這種情況我應該要提供 non-const 和 const 兩個版本? 05/19 14:31
→ CaptainH:或許 foo 的引數可以設計成 const IDrive & 05/19 15:31
→ CaptainH:或是IDrive&& 05/19 15:32
推 Killercat:foo的引數const IDrive &drive是正解。如果foo會改變 05/20 13:33
→ Killercat:drive的話 那這設計可能要改一下 05/20 13:34
→ Killercat:嚴格一點的系統會要求getter只能是const & 這樣可能就 05/20 13:34
→ Killercat:只能傳入整個class讓他在裡面呼叫setter 05/20 13:35
→ Killercat:鬆散一點的話會宣告兩個getter 在鬆散一點的話會僅宣告 05/20 13:35
→ Killercat:non-const版本的getter. 我個人是偏好中庸之道 :D 05/20 13:36