相关文章推荐
腼腆的拖把  ·  makefile的正则匹配字符串和数字 - ...·  9 月前    · 
有情有义的大白菜  ·  NET属性生成“必须声明一个主体,因为它没有 ...·  1 年前    · 
果断的麻辣香锅  ·  万字长文把 VSCode 打造成 C++ ...·  1 年前    · 
忐忑的烤地瓜  ·  用perl ...·  1 年前    · 
光明磊落的啄木鸟  ·  自定义SVG布局编辑 - ...·  1 年前    · 
小百科  ›  如何使用shared_ptr从单例中生成私有析构函数?开发者社区
谈吐大方的茶叶
1 月前
首页
学习
活动
专区
圈层
工具
返回腾讯云官网
提问

问 如何使用shared_ptr从单例中生成私有析构函数?

Stack Overflow用户
提问于 2022-07-27 10:08:52
EN

我测试了来自C++17的两种类型的单例

第一是unique_ptr第二是shared_ptr

它们必须与私有构造函数和析构函数一起工作,因为没有人可以更改任何实例状态。

我最终成功地编写了unique_ptr版本,但是shrared没有完成。

shared_ptr版本出错

错误是 ‘Singleton2 2::~Singleton2 2()’在这个上下文中是私有的‘{_p->~_Up();}

我怎样才能让shared_ptr单身?

这是代码

代码语言: javascript
运行
复制
class Singleton1
    public:
    static Singleton1& GetInstance() 
        if(!mFlag)
            mFlag = true;
            mSingle = std::make_unique<Singleton1>(Singleton1(1));
        return *mSingle.get();
    private:
    friend std::unique_ptr<Singleton1>::deleter_type;
    Singleton1(int n) 
        : mNum(n)
        std::cout << "this is unique_ptr singleton" << std::endl;   
    ~Singleton1() = default;
    private:
    const int mNum;
    inline static bool mFlag;
    inline static std::unique_ptr<Singleton1> mSingle;
};
代码语言: javascript
运行
复制
class Singleton2
    public:
    static Singleton2& GetInstance() 
        if(!mFlag)
            mFlag = true;
            mSingle = std::make_shared<Singleton2>(Singleton2(1));
        return *mSingle.get();
    private:
    Singleton2(int n) 
        : mNum(n)
        std::cout << "this is shared_ptr singleton" << std::endl;   
    ~Singleton2() = default;
    private:
    const int mNum;
    inline static bool mFlag;
    inline static std::shared_ptr<Singleton2> mSingle;
};
代码语言: javascript
运行
复制
int main()
    Singleton1& res = Singleton1::GetInstance();
    Singleton2& res = Singleton2::GetInstance();
    return 0;
}
1 97 0 票数 0
EN
c++
singleton

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-27 10:31:15

您可以使用自定义删除器并使该 friend of Singleton2

代码语言: javascript
运行
复制
#include <memory>
#include <iostream>
class Singleton2
    struct Deleter {
        void operator()(Singleton2* ptr){ delete ptr;}
    friend Deleter;
    public:
    static Singleton2& GetInstance() 
        if(!mFlag)
            mFlag = true;
            mSingle = std::shared_ptr<Singleton2>(new Singleton2(1),Deleter{});
        return *mSingle.get();
    private:
    Singleton2(int n) 
        : mNum(n)
        std::cout << "this is shared_ptr singleton" << std::endl;   
    ~Singleton2() = default;
    private:
    const int mNum;
    inline static bool mFlag;
    inline static std::shared_ptr<Singleton2> mSingle;
int main()
 
推荐文章
腼腆的拖把  ·  makefile的正则匹配字符串和数字 - CSDN文库
9 月前
有情有义的大白菜  ·  NET属性生成“必须声明一个主体,因为它没有标记为抽象或外挂”编译错误-腾讯云开发者社区-腾讯云
1 年前
果断的麻辣香锅  ·  万字长文把 VSCode 打造成 C++ 开发利器 - 知乎
1 年前
忐忑的烤地瓜  ·  用perl 删除匹配行-mfc42d-ChinaUnix博客
1 年前
光明磊落的啄木鸟  ·  自定义SVG布局编辑 - 点击空白显示文字/图片-135编辑器
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号