• 限制类只通过make_shared<_Ty>构造


      其实也有点无聊= =因为看了篇文章,有提到,若一个类 A 中的函数 f() 需要返回自己的指针给调用者

    A* A::f(){ return this;}
    

      难道这样写吗?一个裸指针返回出去,失控了。谁也不知道调用者会干什么? (羞耻的复制原文原话= = ,原文:https://blog.csdn.net/csfreebird/article/details/8282518)

      比较聪明的方法是设计成:

    shared_ptr<A> A::f(){ return shared_from_this(); }
    

      那么后来回想起来,这么做有意义吗?调用者依旧可以通过取地址直接获得裸地址,那么上面这种考虑其实没有意义只能说避免某些“意外”而不能避免有意而为之。

      所以想到约束只能通过 make_shared<_Ty> 函数来创建对象并返回智能指针,将真实地址对外隔离。(本人小白还没研究过能否通过shared_ptr取到真实地址= =暂不考虑)

      于是将构造函数设为私有,但 make_shared<_Ty> 构造需要调用类构造函数,于是跟进去看了一眼

    template<class _Ty,
    	class... _Types> inline
    		shared_ptr<_Ty> make_shared(_Types&&... _Args)
    	{	// make a shared_ptr
    	_Ref_count_obj<_Ty> *_Rx =
    		new _Ref_count_obj<_Ty>(_STD forward<_Types>(_Args)...);
    
    	shared_ptr<_Ty> _Ret;
    	_Ret._Resetp0(_Rx->_Getptr(), _Rx);
    	return (_Ret);
    	}
    

      构造是通过类  _Ref_count_obj<_Ty> 进行,于是在类A中添加

    friend  _Ref_count_obj<A>;
    

      OK,完美解决~

      PS:虽然也可以直接定义一个静态函数调用 make_shared 来传出一个 shared_ptr , 上面的做法反而显得很麻烦,可能当时比较固执= =

  • 相关阅读:
    流畅的python,Fluent Python 第十章笔记
    foo
    std140
    android 开发注意事项
    Android ABI
    mac 基本
    build automation software 自动构建工具
    修改环境变量
    hyphenation
    Latency
  • 原文地址:https://www.cnblogs.com/yc-only-blog/p/8806243.html
Copyright © 2020-2023  润新知