如何在单例实例中使用std :: make_shared

时间:2019-04-07 03:48:34

标签: c++11 singleton shared-ptr

我试图创建一个单例实例的共享指针。以下是我尝试执行的方法。

单个实施:

    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);
    };

现在,问题出在这里很多,因为单例类的副本构造函数被删除,所以代码无法编译。如果我定义了复制构造函数,则确实可以对其进行编译,但是现在它不再是单例类了。

那么,实现此目标的最佳方法是什么?我的目标是要使一个类实例的shared_ptr实例变量和共享资源将是一个单例对象。

请在这里帮助。

1 个答案:

答案 0 :(得分:0)

如果您确保仅在生产者和使用者之后首先创建队列,然后才将其销毁,那么就不需要指向该队列的智能指针。在这种情况下,生产者和消费者只需保持简单的指向队列的指针即可。

共享所有权使您无需考虑谁拥有什么以及他们的寿命,但是,这导致99%的情况下的设计不佳。