using shared_ptr in a class with private or protected constructor

什么时候我们会再一个拥有保护或者私有构造函数的类中使用智能指针呢?这种其中就是我们想:

  • 不愿意类的使用者自己构造类的对象,只能从类的内部产生对象。
  • 想利用智能指针的便利性。

而这样的场景是经常遇到的。在stack overflow上有人分享了一种方法。具体的实现思路是在类内声明一个无意义的保护类型,并将这个保护类型作为公有类型构造函数的一个参数。那么类内使用智能指针时,对这个无意义的保护类型具有访问权限,且构造函数为公有,所以对于智能指针不存在任何访问限制,而在类外想构造类对象,虽然对构造函数具有访问权限,但因为无意义的保护类型受限,所以是无法构造对象的。示例代码:

class A
{
protected:
    struct ConstructorAcess
    {
        explicit ConstructorAcess(int){}
    };
public:
    A(const ConstructorAcess&,string){}
    static shared_ptr<A> create(string str)
    {
        return make_shared<A>(ConstructorAcess{ 0 }, str);
    }
private:
    string _str;
};
shared_ptr<A> pa = A::create("hello");//正确
A a(A::ConstructorAcess{ 0 }, "hello");//错误

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,150评论 1 51
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,271评论 18 399
  • 1.面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 2.什么是类?...
    少帅yangjie阅读 10,444评论 0 14
  • 1. C++基础知识点 1.1 有符号类型和无符号类型 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值...
    Mr希灵阅读 18,087评论 3 82
  • 提一盏油灯 寻一片天空 这里有你的书桌 那端有你的茶壶 虚无席上隐着海棠花 幽清静雅,淡淡迷香 掂起一支绿 化开千...
    枫洛阅读 1,346评论 8 5

友情链接更多精彩内容