[问题] 关于 return reference

楼主: wowslr (平凡姜太公)   2014-05-19 12:27:54
在设计类别的时候一般不会直接 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 吗?
或是有其他更好的设计?谢谢!
作者: kwpn (ITSST)   2014-05-19 12:39:00
因为const IDrive& getDrive()回传const reference但foo(IDrive &drive)想要的是non-const
楼主: wowslr (平凡姜太公)   2014-05-19 14:31:00
所以这种情况我应该要提供 non-const 和 const 两个版本?
作者: CaptainH (Cannon)   2014-05-19 15:31:00
或许 foo 的引数可以设计成 const IDrive &或是IDrive&&
作者: Killercat (杀人猫™)   2014-05-20 13:33:00
foo的引数const IDrive &drive是正解。如果foo会改变drive的话 那这设计可能要改一下严格一点的系统会要求getter只能是const & 这样可能就只能传入整个class让他在里面呼叫setter松散一点的话会宣告两个getter 在松散一点的话会仅宣告non-const版本的getter. 我个人是偏好中庸之道 :D

Links booklink

Contact Us: admin [ a t ] ucptt.com