#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% случаев.