Получить ошибку, когда я помещаю элемент в вектор - PullRequest
0 голосов
/ 07 октября 2018

Я получаю ошибку 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 голосов
/ 07 октября 2018

В этой строке:

container.push_back(tmp);

вы пытаетесь скопировать my_t объект.Это вызовет конструктор копирования (по умолчанию, предоставленный компилятором), но его не может быть.Он не может существовать, потому что он будет копировать всех членов по одному, а std::mutex имеет конструктор копирования delete d. .

Это на самом деле не делаетсмысл для мьютекса быть копируемым.У них нет семантики значений , и они имеют смысл только тогда, когда существуют вместе с фактическим значением.

Так что создайте свой собственный конструктор копирования для my_t, который копирует все элементы, которые онможет, и просто по умолчанию создает другие.

Вы почти наверняка также захотите глубокое копирование элемент conn и сделаете его std::unique_ptr<A>, чтобы убедиться, что он получает delete d правильно, когда объект разрушается.

0 голосов
/ 07 октября 2018

У вас не может быть вектора ваших my_t объектов, потому что класс my_t содержит std::mutex es:

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

Мьютексы имеют конструктор удаленных копий .Не существует такого понятия, как создание мьютекса при копировании.

Так как ваш класс my_t также не имеет конструктора копирования, он также автоматически удаляет конструктор копирования my_t.

Класс значений std::vector должен иметь, как минимум, конструктор копирования и оператор присваивания .Это потому, что вектор должен быть в состоянии перераспределить свое содержимое, чтобы приспособиться к его росту.Это означает, что элементы в векторе должны быть копируемыми / присваиваемыми.

Если вы явно реализуете конструктор копирования и оператор присваивания для своего my_t класса, вы сможете сделать из них вектор,Но тогда вам нужно будет выяснить, что значит копировать-конструировать и назначать вашему my_t классу ...

Самое большее, что вы можете сделать, с вашим классом как есть, это иметьвектор указателей на my_t экземпляров.Возможно использование std::unique_ptr или std::shared_ptr.

...