[原创文章欢迎转载,但请保留作者信息] Justin 于 2009-12-09
Item15告诉我们这个世界是现实的,有人往左就有人往右。为了保证更多的人能用好你的代码,在使用对象管理资源的同时也要留出接口给那些需要绕过对象而直接访问资源的人。(我个人是不太情愿这样做……) 方法说起来是相当的简单:写个函数暴露出指向资源的指针就可以。书里讲得更多的是用怎样的函数:
可以实现一个get函数,或是*、->运算,返回指向资源的指针。这个叫做显式转换(explicit conversion) 也可以实现一个隐式的转换函数(implicit conversion),这里要抄一下完整的代码,仅仅因为我没有读过也没有写过这样的转换函数。但是个人觉得实际工作中应该是不提倡这样做的,因为隐式的转换极有可能发生在编程者没有意识的情况下,导致后面的代码出错。
class Font { public: // .. // implicit conversion function operator FontHandle() const { return f; } // .. }; 上面代码的应用如下,f本身为Font类型,(changeFontSize第一个参数为FontHandle),但是由于隐式转换,类型变成了FontHandle。
Font f(getFont()); int newFontSize; //.. // implicitly convert Font to FontHandle changeFontSize(f, newFontSize); 回头看这个Item的重点:做人留一线,日后好相见。为了能兼容更多的API,大师认为需要留出接口提供对资源的直接访问。
|