как использовать std :: make_shared с единичным экземпляром - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь создать общий указатель экземпляра синглтона.Ниже описан способ, которым я пытаюсь это сделать.

Реализация синглтона:

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

Теперьпроблема в том, что код не компилируется, потому что конструктор копирования класса singleton удален.Если я определю конструктор копирования, он будет скомпилирован, но тогда он больше не является одноэлементным классом.

Итак, каков наилучший способ добиться этого?Моя цель состоит в том, чтобы я хотел сделать переменную экземпляра shared_ptr экземпляра класса, а общим ресурсом был бы одноэлементный объект.

Пожалуйста, помогите здесь.

1 Ответ

0 голосов
/ 07 апреля 2019

Если вы гарантируете, что вы создаете очередь сначала и только после производителей и потребителей, чтобы они были уничтожены первыми, вам не нужен умный указатель на очередь.В этом случае производитель и потребители могут просто держать простой указатель на очередь.

Совместное владение избавляет вас от размышлений о том, кто чем владеет, и их продолжительности жизни, что приводит к плохим проектам в 99% случаев.

...