当我将元素推到向量上时出现错误

时间:2018-10-06 23:12:23

标签: c++ class vector types

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

#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) {}

或在Coliru上:https://coliru.stacked-crooked.com/a/11625c77383df80c

2 个答案:

答案 0 :(得分:4)

您不能拥有target对象的向量,因为my_t类包含my_t es:

std::mutex

Mutexes have a deleted copy constructor。没有复制构造互斥锁的事情。

由于您的 std::mutex bmtx; std::mutex amtx; 类也没有副本构造函数,因此也会自动删除my_t的副本构造函数。

my_t的值类必须至少具有a copy constructor and an assign operator。这是因为向量必须能够重新分配其内容,以适应其增长。这意味着向量中的元素必须是可复制/可分配的。

如果您为std::vector类显式实现了一个复制构造函数和一个赋值运算符,则可以从中创建一个向量。但是随后您将需要弄清楚将复制构造并分配给my_t类的含义……

对于您的类,您可以做的最大事情就是拥有一个指向my_t实例的指针向量。也许使用my_tstd::unique_ptr

答案 1 :(得分:3)

在这一行:

container.push_back(tmp);

您尝试复制一个my_t对象。这将调用(默认,由编译器提供)副本构造函数,但是它不存在。它不存在,因为它将一一复制所有成员,并std::mutex has a deleted copy constructor.

互斥体是可复制的,这实际上没有任何意义。它们没有value semantics,只有在与实际值并存时才有意义。

因此,为my_t创建一个自己的副本构造函数,该副本构造函数将复制它可以复制的所有成员,而默认情况下将构造其他成员。

几乎可以肯定的是,您还想deep copyconn成员,并使其也成为std::unique_ptr<A>,以确保在对象被获取时正确地delete毁了。