读书人

请一下这段代码

发布时间: 2012-04-10 21:03:56 作者: rapoo

请高手指点一下这段代码~
/*
* owned_ptr - ownership aware auto-deleting pointer
*
* Note: Do not use in an STL container!
*/

#ifndef OWNED_PTR_H
#define OWNED_PTR_H

/* For ANSI-challenged compilers, you may want to #define
* NO_MEMBER_TEMPLATES, explicit or mutable */

template <class X> class owned_ptr
{
public:
typedef X element_type;

explicit owned_ptr(X* p=0) throw() : itsOwn(p!=0), itsPtr(p) {}
~owned_ptr() {if (itsOwn) delete itsPtr;}
owned_ptr(const owned_ptr> & r) throw()
: itsOwn(r.itsOwn), itsPtr(r.release()) {}
owned_ptr& operator=(const owned_ptr& r) throw()
{
if (&r != this) {
if (itsPtr != r.itsPtr) {
if (itsOwn) delete itsPtr;
itsOwn = r.itsOwn;
}
else if (r.itsOwn) itsOwn = true;
itsPtr = r.release();
}
return *this;
}

#ifndef NO_MEMBER_TEMPLATES
template <class Y> friend class owned_ptr <Y> ;
template <class Y> owned_ptr(const owned_ptr <Y> & r) throw()
: itsOwn(r.itsOwn), itsPtr(r.release()) {}
template <class Y> owned_ptr& operator=(const owned_ptr <Y> & r) throw()
{
if (&r != this) {
if (itsPtr != r.itsPtr) {
if (itsOwn) delete itsPtr;


itsOwn = r.itsOwn;
}
else if (r.itsOwn) itsOwn = true;
itsPtr = r.release();
}
return *this;
}
#endif

X& operator*() const throw() {return *itsPtr;}
X* operator-> () const throw() {return itsPtr;}
X* get() const throw() {return itsPtr;}
X* release() const throw()
#ifndef mutable
{itsOwn = false; return itsPtr;}
#else // for ANSI-challenged compilers
{(const_cast <owned_ptr <X> * > (this))-> itsOwn = false; return itsPtr;}
#endif

private:
mutable bool itsOwn;
X* itsPtr;
};


#endif // OWNED_PTR_H

看不懂#ifndef NO_MEMBER_TEMPLATES 之间的那一段, 是什么意思呢?

第一个问题: 中间这段代码有存在的意义么? No Member Templates 是什么?

第二个问题: 好像中间定义的一些函数跟上面的有重复的地方? 如果我#define NO_MEMBER_TEMPLATES, 编译器会怎么做? 为什么声明自己的类为友类?

谢谢~

[解决办法]
NO_MEMBER_TEMPLATES的字面意思就是 "成员函数不能是模板 "
注意operator=是类owned_ptr <X> 的一个成员函数,而它本身又是一个模板函数(模板参数Y).有些编译器(例如VC6)不支持这种写法.故原作者把它放到#ifndef NO_MEMBER_TEMPLATES段中以方便选用或去掉这个函数定义.
[解决办法]

/* For ANSI-challenged compilers, you may want to #define
* NO_MEMBER_TEMPLATES, explicit or mutable */

这段话提示你对于不完全符合C++标准(ANSI/ISO 14882)的编译器,可能需要
#define NO_MEMBER_TEMPLATES

从这个宏的字面义以及代码中看,NO_MEMBER_TEMPLATES是指不支持成员模板和友元模版。
成员模版是C++标准中(参见[temp.mem])规定的一个特性,允许在类(以及类模版)中定义模版。
友元模版也包含在C++标准中(参见[temp.friend]),允许类(以及类模版)的友元是模版。
由于 copy constructor 和 operator= 必须是类的成员;所以,只有编译器支持成员模版,才可以定义这两个函数模版,从而支持不同类别owner_ptr间做拷贝、赋值。
而为了实现这两个函数,还需将将owner_ptr <Y> 定义成owner_ptr <X> 的友元。

读书人网 >C++

热点推荐