Я пытаюсь создать общий указатель экземпляра singleton. Ниже показано, как я пытаюсь это сделать.
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 экземпляра класса, а общий ресурс будет одноэлементным объектом.
Пожалуйста, помогите здесь.
Потому что мне нужно, чтобы одна и та же очередь сообщений была разделена между производителем и потребителем.
shared_ptr
речь идет о совместном владении, а не о совместном доступе. Это синглтон, общий дизайн, но он никому не принадлежит.
Хорошо, понял. Но если я все еще хочу это сделать, есть ли способ для этого?
Если вы гарантируете, что создаете очередь первой и только после производителей и потребителей, чтобы они уничтожались первыми, вам не нужен интеллектуальный указатель на очередь. В этом случае производитель и потребители могут просто сохранить простой указатель на очередь.
Совместное владение избавляет вас от размышлений о том, кто чем владеет, и о сроках их жизни, однако это приводит к плохим проектам в 99% случаев.
Зачем вам нужен общий указатель на синглтон?