C++,模版类为什么要添加自己为友元呢?帮我看看这段代码

Timor君 发布于 2012/08/20 09:59
阅读 633
收藏 0

功能:网上找的代码,主要是实现一个smart_pointer

代码:

namespace yellow_thread_lib
{
	/*
	not free pointer
	*/
    template< class _Type >
    class sp_no_free
    {
    public:
        static void free(_Type *)
        {
        }
    };

	/*
	free pinter
	*/
    template< class _Type >
    class sp_free
    {
    public:
        static void free(_Type *p)
        {
            delete p;
			p = NULL;
        }
    };
	/*
	smart pointer by class  and free class
	定义一个类型,同时定义该类型的一个智能指针
	*/
    template< class _Type, class _Free = sp_free< _Type > >
    class smart_ptr 
    {
        class _TypeWrap
        {
        public:
            _TypeWrap(_Type* p):m_lRefCount(1)
            {
                m_pData = p;
            }
            ~_TypeWrap()
            {
                if(m_pData)
                    _Free::free( m_pData );
            }
            LONG AddRef()
            {
#ifdef _MT
                return ::InterlockedIncrement(&m_lRefCount);
#else
                return m_lRefCount++;
#endif
            }
            void Release()
            {
#ifdef _MT
                if(!::InterlockedDecrement(&m_lRefCount))
#else
                if(!(--m_lRefCount))
#endif
                    delete this;
            }
            inline _Type* GetPtr()
            {
                return m_pData;
            }
        private:
            volatile LONG	m_lRefCount;
            _Type*			m_pData;
        };
    public:
        explicit smart_ptr(_Type *p = NULL) 
        {
            m_pTypeWrap = new _TypeWrap(p);
        }
		/*
		copy constructor 
		*/
        smart_ptr(const smart_ptr<_Type, _Free>& ref):m_pTypeWrap(NULL) 
        {
            *this = ref;
        }
        ~smart_ptr()
        {
            if(m_pTypeWrap)
                m_pTypeWrap->Release(); 
        }
		/*
		override = operator
		*/
        smart_ptr<_Type, _Free>& operator=(const smart_ptr<_Type, _Free>& _Right)
        {
            if(GetPtr() != _Right.GetPtr())
            {
                if(m_pTypeWrap) // 和后面的一样,主要是为了判断NULL的情况
                {
                    m_pTypeWrap->Release();
                }
                m_pTypeWrap = _Right.m_pTypeWrap;
                if(m_pTypeWrap)
                    m_pTypeWrap->AddRef();
            }
            return (*this); 
        }
		/*
		override == operator
		*/
        bool operator ==(const smart_ptr<_Type, _Free>& _Right)const
        {
            return (GetPtr() == _Right.GetPtr());
        }
        inline operator bool()const
        {
            return (GetPtr() != NULL);
        }
        inline bool operator!() const 
        {
            return (GetPtr() == NULL);
        }
        inline _Type& operator*() const throw()
        {
            return (*GetPtr()); 
        }
        inline _Type *operator->() const
        {
            return (GetPtr()); 
        }
        inline _Type *GetPtr() const
        {
            return ((m_pTypeWrap)?(m_pTypeWrap->GetPtr()):(NULL)); 
        }
    private:
        friend class smart_ptr<_Type, _Free>; 
        _TypeWrap *m_pTypeWrap;
    };

#ifndef SP_NULL
    #define SP_NULL(type)	(yellow_thread_lib::smart_ptr<type>(NULL))
#endif
}

问题:

friend class smart_ptr<_Type, _Free>;

这一行不理解,怎么会添加自己为友元,这样写有什么用吗?

 

加载中
0
Timor君
Timor君

好像是为了兼容老的编译器。

m_pTypeWrap = _Right.m_pTypeWrap;这句访问了私有成员
没人回答就这么理解了

0
cha0xc
cha0xc
呃… 自问自答。
cha0xc
cha0xc
原来OSC可以自问自答,推荐自答为最佳答案,以后有空也试试,哈哈!
Timor君
Timor君
提出问题这段时间我在群里问出来的答案
0
billzheng
billzheng

你有测试这段代码么? 把friend class smart_ptr<_Type, _Free>;去掉也测试一下?

就不肯怀疑这段代码有问题??

billzheng
billzheng
Also, why don't you want to use std::shared_ptr instead of copying from internet?
billzheng
billzheng
回复 @远山如此 :I removed the 'friend class......' part and compiled ok. looks like the friend declaration is not necessary.
Timor君
Timor君
我肯定侧过,代码绝对没问题。
0
billzheng
billzheng
friend   class   smart_ptr<_Type, _Free>;去掉,然后测试过?
Timor君
Timor君
嗯 测过
0
S
SilkWood

如果是这样的话,那么有私有成员数据的类难道没有拷贝构造函数吗?

返回顶部
顶部