为具有成员 std::mutex(或其他不可复制对象)的 class 复制或移动构造函数?
Copy or Move Constructor for a class with a member std::mutex (or other non-copyable object)?
class A
{
private:
class B
{
private:
std::mutex mu;
A* parent = NULL;
public:
B(A* const parent_ptr): parent(parent_ptr) {}
B(const A::B & b_copy) { /* I thought I needed code here */ }
};
public:
B b = B(this); //...to make this copy instruction work.
// (Copy constructor is deleted, need to declare a new one?)
};
我有一个 class B
,它基本上是一个线程安全的任务队列。它包含一个 deque
、一个 mutex
和一个 condition_variable
。它促进了由 class A
启动的任何两个线程之间的 consumer/producer 关系。我已经尽可能地简化了代码。
问题始于将 mutex
作为成员:这会删除默认的复制构造函数。这只是意味着我可以使用 B(this)
构造,但我无法使用 B b = B(this)
构造 和 副本,这是我需要在为了给 class A
class B
的成员。解决这个问题的最佳方法是什么?
多亏了 Doug 关于使用 std::unique_ptr 的建议,我的 class 现在非常简单并且可以满足我的要求。这是我的最终解决方案。
class A
{
private:
class B
{
private:
std::unique_ptr<std::mutex> mu_ptr = std::make_unique<std::mutex>()
A* parent = NULL;
public:
B(A* const parent_ptr) : parent(parent_ptr) {}
};
public:
B b = B(this); // This now works! Great.
};
简单的解决方案是在 class 中使用 std::unique_ptr<std::mutex>
,并用 std::make_unique(...)
初始化它,其中 ...
是您的 std::mutex
构造函数参数,如果有的话。
这将允许移动但不允许复制。要使其可复制,您需要在复制构造函数中初始化副本,假设副本应该有自己的锁。
如果副本应该共享那个锁,那么你应该使用 std::shared_ptr
。即可复制可移动
class A
{
private:
class B
{
private:
std::mutex mu;
A* parent = NULL;
public:
B(A* const parent_ptr): parent(parent_ptr) {}
B(const A::B & b_copy) { /* I thought I needed code here */ }
};
public:
B b = B(this); //...to make this copy instruction work.
// (Copy constructor is deleted, need to declare a new one?)
};
我有一个 class B
,它基本上是一个线程安全的任务队列。它包含一个 deque
、一个 mutex
和一个 condition_variable
。它促进了由 class A
启动的任何两个线程之间的 consumer/producer 关系。我已经尽可能地简化了代码。
问题始于将 mutex
作为成员:这会删除默认的复制构造函数。这只是意味着我可以使用 B(this)
构造,但我无法使用 B b = B(this)
构造 和 副本,这是我需要在为了给 class A
class B
的成员。解决这个问题的最佳方法是什么?
多亏了 Doug 关于使用 std::unique_ptr 的建议,我的 class 现在非常简单并且可以满足我的要求。这是我的最终解决方案。
class A
{
private:
class B
{
private:
std::unique_ptr<std::mutex> mu_ptr = std::make_unique<std::mutex>()
A* parent = NULL;
public:
B(A* const parent_ptr) : parent(parent_ptr) {}
};
public:
B b = B(this); // This now works! Great.
};
简单的解决方案是在 class 中使用 std::unique_ptr<std::mutex>
,并用 std::make_unique(...)
初始化它,其中 ...
是您的 std::mutex
构造函数参数,如果有的话。
这将允许移动但不允许复制。要使其可复制,您需要在复制构造函数中初始化副本,假设副本应该有自己的锁。
如果副本应该共享那个锁,那么你应该使用 std::shared_ptr
。即可复制可移动