如何将 std::make_shared 与单例实例一起使用

how to use std::make_shared with a singleton instance

我正在尝试创建一个单例实例的共享指针。以下是我正在尝试的方式。

单例实现:

    class MessageQueue
    {
        private:

            std::mutex _mutex;
            std::queue<std::string> _messageQueue;
            MessageQueue() {}

        public:

            MessageQueue(const MessageQueue& obj) = delete;
            MessageQueue& operator=(const MessageQueue& obj) = delete;
            static MessageQueue& getInstance()
            {
                static MessageQueue instance;
                return instance;
            }
            void pushMessage(std::string& message);
            std::string popMessage();
            void flushOut();
    };

使用单例实例创建共享指针:

    class Producer
    {
        private:

            std::shared_ptr<messagequeue::MessageQueue> _queue;

        public:

            Producer()
            {
                if(!_queue)
                {
                    auto& instance = messageq::MessageQueue::getInstance();
                    _queue = std::make_shared<messageq::MessageQueue>(instance);
                }
            }
            Producer(const Producer& obj);
            Producer& operator=(const Producer& obj);
    };

现在,问题就这么多了,代码无法编译,因为单例 class 的复制构造函数被删除了。如果,我定义了复制构造函数,它确实会被编译,但是现在它不再是一个单例了[=2​​7=]。

那么,实现这一目标的最佳方法是什么?我的 objective 是我想创建一个 class 实例的 shared_ptr 实例变量,共享资源将是一个单例对象。

请帮忙。

如果您确保先创建队列,并且仅在生产者和消费者之后创建队列,以便它们先被销毁,则不需要指向队列的智能指针。在这种情况下,生产者和消费者可以只保留指向队列的普通指针。

共享所有权使您无需考虑谁拥有什么以及他们的生命周期,但是,这在 99% 的情况下会导致糟糕的设计。