下面是兩個auot_ptr的實現。第一個版本文檔化了類的介面並在類的定義體外面實現了所有的成員函數。第二個版本將所有的成員函數都實現在定義體內了。
在風格上,第二個實現不如第一個,因為它沒有將類的介面從實現中分離出來。但是auto_ptr只是一個簡單的類,所以第二個實現比第一個清晰得多。
這是把auto_ptr的介面和實現分開的版本:
template<class T><br />class auto_ptr {<br />public:<br /> explicit auto_ptr(T *p = 0); // Item M5 有“explicitfor”<br /> // 的描述<br /> template<class U> // 拷貝建構函式成員模板<br /> auto_ptr(auto_ptr<U>& rhs); // (見Item M28):<br /> // 用另一個類型相容的<br /> // auto_ptr對象<br /> // 初始化一個新的auto_ptr對象<br /> ~auto_ptr();<br /> template<class U> // 賦值操作成員模板<br /> auto_ptr<T>& // (見Item M28):<br /> operator=(auto_ptr<U>& rhs); // 用另一個類型相容的<br /> // auto_ptr對象給它賦值<br /> T& operator*() const; // 見Item M28<br /> T* operator->() const; // 見Item M28<br /> T* get() const; // 返回包容指標的<br /> // 當前值<br /> T* release(); // 放棄包容指標的<br /> // 所有權,<br /> // 並返回其當前值<br /> void reset(T *p = 0); // 刪除包容指標,<br /> // 獲得指標p的所有權<br />private:<br /> T *pointee;<br />template<class U> // 讓所有的auto_ptr類<br />friend class auto_ptr<U>; // 成為友元<br />};</p><p>template<class T><br />inline auto_ptr<T>::auto_ptr(T *p)<br />: pointee(p)<br />{}</p><p>template<class T><br /> inline auto_ptr<T>::auto_ptr(auto_ptr<U>& rhs)<br /> : pointee(rhs.release())<br /> {}</p><p>template<class T><br />inline auto_ptr<T>::~auto_ptr()<br />{ delete pointee; }</p><p>template<class T><br /> template<class U><br /> inline auto_ptr<T>& auto_ptr<T>::operator=(auto_ptr<U>& rhs)<br /> {<br /> if (this != &rhs) reset(rhs.release());<br /> return *this;<br /> }</p><p>template<class T><br />inline T& auto_ptr<T>::operator*() const<br />{ return *pointee; }</p><p>template<class T><br />inline T* auto_ptr<T>::operator->() const<br />{ return pointee; }</p><p>template<class T><br />inline T* auto_ptr<T>::get() const<br />{ return pointee; }</p><p>template<class T><br />inline T* auto_ptr<T>::release()<br />{<br /> T *oldPointee = pointee;<br /> pointee = 0;<br /> return oldPointee;<br />}</p><p>template<class T><br />inline void auto_ptr<T>::reset(T *p)<br />{<br /> if (pointee != p) {<br /> delete pointee;<br /> pointee = p;<br /> }<br />}<br />
下面是將所有函數定義在類定義體內的auto_ptr模板。如你所見,它容易看懂:
template<class T><br />class auto_ptr {<br />public:<br /> explicit auto_ptr(T *p = 0): pointee(p) {}<br /> template<class U><br /> auto_ptr(auto_ptr<U>& rhs): pointee(rhs.release()) {}<br /> ~auto_ptr() { delete pointee; }<br /> template<class U><br /> auto_ptr<T>& operator=(auto_ptr<U>& rhs)<br /> {<br /> if (this != &rhs) reset(rhs.release());<br /> return *this;<br /> }<br /> T& operator*() const { return *pointee; }<br /> T* operator->() const { return pointee; }<br /> T* get() const { return pointee; }<br /> T* release()<br /> {<br /> T *oldPointee = pointee;<br /> pointee = 0;<br /> return oldPointee;<br /> }<br /> void reset(T *p = 0)<br /> {<br /> if (pointee != p) {<br /> delete pointee;<br /> pointee = p;<br /> }<br /> }<br /> private:<br /> T *pointee;<br /> template<class U> friend class auto_ptr<U>;<br /> };
如果你所用的編譯器還不支援“explicit”,可以安全地用#define取消它的存在:
#define explicit
這不會造成auto_ptr的任何功能減弱,但導致輕微的安全性減弱。詳見Item M5。