如何将 std::make_shared 与单例实例一起使用
how to use std::make_shared with a singleton instance
我正在尝试创建一个单例实例的共享指针。以下是我正在尝试的方式。
单例实现:
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);
};
现在,问题就这么多了,代码无法编译,因为单例 class 的复制构造函数被删除了。如果,我定义了复制构造函数,它确实会被编译,但是现在它不再是一个单例了[=27=]。
那么,实现这一目标的最佳方法是什么?我的 objective 是我想创建一个 class 实例的 shared_ptr 实例变量,共享资源将是一个单例对象。
请帮忙。
如果您确保先创建队列,并且仅在生产者和消费者之后创建队列,以便它们先被销毁,则不需要指向队列的智能指针。在这种情况下,生产者和消费者可以只保留指向队列的普通指针。
共享所有权使您无需考虑谁拥有什么以及他们的生命周期,但是,这在 99% 的情况下会导致糟糕的设计。
我正在尝试创建一个单例实例的共享指针。以下是我正在尝试的方式。
单例实现:
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);
};
现在,问题就这么多了,代码无法编译,因为单例 class 的复制构造函数被删除了。如果,我定义了复制构造函数,它确实会被编译,但是现在它不再是一个单例了[=27=]。
那么,实现这一目标的最佳方法是什么?我的 objective 是我想创建一个 class 实例的 shared_ptr 实例变量,共享资源将是一个单例对象。
请帮忙。
如果您确保先创建队列,并且仅在生产者和消费者之后创建队列,以便它们先被销毁,则不需要指向队列的智能指针。在这种情况下,生产者和消费者可以只保留指向队列的普通指针。
共享所有权使您无需考虑谁拥有什么以及他们的生命周期,但是,这在 99% 的情况下会导致糟糕的设计。