当我将元素推到矢量上时出错

Get error when I push element onto vector

本文关键字:出错 元素      更新时间:2023-10-16

当我想将元素添加到带有container.push_back(tmp);的向量时,我的代码出现is implicitly deleted because the default definition would be ill-formed错误,这是为什么? 我的代码:

#include <vector>
#include <mutex>
class A {
public:
A(){}
~A(){}
};
class my_t {
private:
bool busy;
bool alive;
std::mutex bmtx;
std::mutex amtx;
public:
my_t(){std::lock_guard<std::mutex>lock(bmtx);busy=false;}
~my_t(){}
A* conn; 
void take(void) {std::lock_guard<std::mutex>lock(bmtx);busy=true; }
void give(void) {std::lock_guard<std::mutex>lock(bmtx);busy=false; }
bool busy_get(void) {return busy;}
void set_online(void){ std::lock_guard<std::mutex>lock(amtx); alive=true; }
void set_OFFLINE(void) {std::lock_guard<std::mutex>lock(amtx); alive=false; }
bool alive_get(void) {return alive;}
};
class app {
private:
std::vector<my_t> container;
public: 
app();
~app();
};
app::app() {
my_t tmp;
tmp.conn = new A();
if (tmp.conn)
tmp.set_online();
container.push_back(tmp);

}
int main(void) {}

或在科利鲁:https://coliru.stacked-crooked.com/a/11625c77383df80c

不能有my_t对象的向量,因为my_t类包含std::mutexes:

std::mutex bmtx;
std::mutex amtx;

互斥体具有已删除的复制构造函数。没有复制构造互斥锁这样的事情。

由于您的my_t类也没有复制构造函数,因此这也会自动删除my_t的复制构造函数。

std::vector的值类必须至少有一个复制构造函数和一个赋值运算符。这是因为向量必须能够重新分配其内容,以适应其增长。这意味着向量中的元素必须是可复制/可分配的。

如果为my_t类显式实现复制构造函数和赋值运算符,则可以从它们创建向量。但是,您需要弄清楚复制构造并分配给my_t类意味着什么......

对于您的类,您最多可以做的是拥有指向my_t实例的指针向量。也许使用std::unique_ptrstd::shared_ptr.

在这一行中:

container.push_back(tmp);

您尝试复制my_t对象。这将调用(默认的,编译器提供的(复制构造函数,但这不存在。它不能存在,因为它会一个接一个地复制所有成员,并且std::mutex有一个deleted 复制构造函数。

互斥锁是可复制的并没有真正的意义。它们没有值语义,只有当它们与实际值一起存在时,它们才有意义。

因此,请为my_t创建自己的复制构造函数,它会复制所有可以复制的成员,并默认构造其他成员。

您几乎肯定还希望深度复制conn成员,并使其成为std::unique_ptr<A>,以确保在对象被破坏时正确delete