首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请一下这段代码

2012-04-10 
请高手指点一下这段代码~/**owned_ptr-ownershipawareauto-deletingpointer**Note:DonotuseinanSTLcontain

请高手指点一下这段代码~
/*
  *   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> 的友元。

热点排行