[原創文章歡迎轉載,但請保留作者信息] 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,大師認為需要留出接口提供對資源的直接訪問。
|