相关文章推荐
温柔的啄木鸟  ·  如何使用Shell脚本从CSV文件中读取输入 ...·  2 年前    · 
伤情的肉夹馍  ·  代码质量管理的一些思路_腾讯新闻·  3 年前    · 
果断的围巾  ·  git 查看对比的方法log diff - ...·  3 年前    · 
Code  ›  如何使用shared_ptr从单例中生成私有析构函数?开发者社区
https://cloud.tencent.com/developer/ask/sof/107160790
谈吐大方的茶叶
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()
 
推荐文章
温柔的啄木鸟  ·  如何使用Shell脚本从CSV文件中读取输入并将其附加到变量中?
2 年前
伤情的肉夹馍  ·  代码质量管理的一些思路_腾讯新闻
3 年前
果断的围巾  ·  git 查看对比的方法log diff - little_ab - 博客园
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号