как использовать std::make_shared с одноэлементным экземпляром

#c 11 #singleton #shared-ptr

#c 11 #singleton #общий доступ-ptr

Вопрос:

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

Реализация Singleton:

     class MessageQueue
    {
        private:

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

        public:

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

Использование одноэлементного экземпляра для создания общего указателя:

     class Producer
    {
        private:

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

        public:

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

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

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

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

Комментарии:

1. Зачем вам нужен общий указатель на singleton?

2. Потому что мне нужна одна и та же очередь сообщений, которая должна быть разделена между производителем и потребителем.

3. shared_ptr речь идет о совместном владении, а не об общем доступе. Это singleton, его разделяют по дизайну, но им никто не владеет.

4. Ладно, понял. Но, при условии, что я все еще хочу это сделать, есть ли какой-нибудь способ для этого?

Ответ №1:

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

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