我试图创建一个单例实例的共享指针。以下是我尝试执行的方法。
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实例变量和共享资源将是一个单例对象。
请在这里帮助。
答案 0 :(得分:0)
如果您确保仅在生产者和使用者之后首先创建队列,然后才将其销毁,那么就不需要指向该队列的智能指针。在这种情况下,生产者和消费者只需保持简单的指向队列的指针即可。
共享所有权使您无需考虑谁拥有什么以及他们的寿命,但是,这导致99%的情况下的设计不佳。