Класс неявно удален, потому что определение по умолчанию будет неправильно сформировано - PullRequest
0 голосов
/ 15 апреля 2019

У меня проблема с классом, который я пытаюсь создать в другом.Я новичок в C ++ (из Java) и не понимаю, почему мой заголовочный файл не очень хорош ...

Короче говоря, я создаю приложение, которое позволяет создавать, редактировать исохранить + загрузить карту из стен.Я написал класс Wall, который получает параметры плюс QGraphicsScene в MainWindow, чтобы связать класс Wall с его графическим представлением.Я использую Qt для графических аспектов.Поскольку я новичок в этом, вещи имеют тенденцию взрываться в моих руках.MainWindow имеет функцию createWall (), которая вызывается всякий раз, когда QDialog испускает accept (), а его данные собираются и отправляются в функцию.

wall.h


#ifndef WALL_H
#define WALL_H

#include <QtWidgets>

class Wall
{
public:
    explicit Wall(float x = 0, float y = 0, float lent = 0, float th = 0, float eps = 0, float sig = 0, QGraphicsScene *scene = nullptr);
    ~Wall();

    float getX() const;
    void setX(float value);

    float getY() const;
    void setY(float value);

    float getLent() const;
    void setLent(float value);

    float getTh() const;
    void setTh(float value);

    float getEps() const;
    void setEps(float value);

    float getSig() const;
    void setSig(float value);

    QGraphicsScene *getScene() const;
    void setScene(QGraphicsScene *value);

private:
    float x;
    float y;
    float lent;
    float th;
    float eps;
    float sig;
    QGraphicsRectItem rect;
    QGraphicsScene *scene;
};

#endif // WALL_H

wall.cpp

#include "wall.h"

Wall::Wall(float x1, float y1, float lent1, float th1, float eps1, float sig1, QGraphicsScene *scene1)
{
    this->x = x1;
    this->y = y1;
    this->lent = lent1;
    this->th = th1;
    this->eps = eps1;
    this->sig = sig1;
    this->scene = scene1;
    QGraphicsRectItem *rect;
    QBrush blackBrush(Qt::black);
    QPen blackPen(Qt::black);
    blackPen.setWidth(1);
    rect = scene->addRect(0,0,10,50,blackPen,blackBrush);
    rect->setFlag(QGraphicsItem::ItemIsMovable);
}
...

mainwindow.cpp

void MainWindow::createWall(float th, float eps, float sig)
{
    std::cout << "Thickness = " << th << "\nPermittivity = " << eps << "\nConductivity = " << sig << "\n";
    Wall wall(0,0,50,th,eps,sig,scene);
    walls.push_back(wall);
    wall_number++;
    std::cout << "Wall number = " << wall_number << "\n";
}

3 ошибки в wall.h:

/usr/include/c++/7/ext/new_allocator.h:136: error: use of deleted function ‘Wall::Wall(const Wall&)’

{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/home/.../wall.h:6: error: ‘QGraphicsRectItem::QGraphicsRectItem(const QGraphicsRectItem&)’ is private within this context

/home/.../wall.h:6: error: use of deleted function ‘QGraphicsRectItem::QGraphicsRectItem(const QGraphicsRectItem&)’

class Wall
      ^~~~

Может быть, я делаю здесь что-то очень глупое ... ЯЯ искал, и кажется, что мой конструктор просто не работает, поскольку он удален по умолчанию.И все же я думаю, что правильно его инициализировал, не так ли?

1 Ответ

0 голосов
/ 15 апреля 2019

Вы запутались, потому что у вашего класса есть закрытый член QGraphicsRectItem rect;, а у вашего конструктора есть локальная переменная QGraphicsRectItem *rect;.

Измените ваш класс 'rect на указатель, удалите строку объявления QGraphicsRectItem *rect; в теле конструктора, и все в порядке.

Чтобы предотвратить утечки памяти, вы должны удалить QGraphicsRectItem в деструкторе. (Он не пропускает память, потому что все предметы принадлежат сцене, но предметы начнут конгломерироваться в вашей сцене.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...