Где я должен поставить новый / удалить при создании класса - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть часть кода, которую я тестировал и работал, и теперь я хотел бы сделать его классом, чтобы иметь что-то чище. Следующий код создает сцену, содержащую прямоугольник, и отображает ее в виджете «graphicview»

QGraphicsScene *scene = new QGraphicsScene;
QGraphicsRectItem *rect = new QGraphicsRectItem();
rect->setRect(0,0,100,100);
scene->addItem(rect);
ui->graphicsView->setScene(scene);

Теперь я хотел бы создать класс, содержащий эту сцену, так что мне просто нужно вызвать:

MyClass *myscene = new MyClass;
ui->graphicsView->setScene(myscene->scene)

В классе MyClass очередь должна иметь приватный аргумент, объявленный как QGraphicsScene *scene = new QGraphicsScene;, или просто приватный аргумент QGraphicsScene *scene, а затем внутри конструктора *scene=new QGraphicsScene

И то же самое для того, куда я должен поместить удаление, в деструкторе MyScene?

редактировать: основываясь на ответе, я пытался переделать свой код без new:

QGraphicsScene scene;
QGraphicsRectItem rect;
rect.setRect(0,0,100,100);
scene.addItem(&rect);
ui->graphicsView->setScene(&scene);

Но этот код не работает (виджет 'graphicView' ничего не отображает), и все примеры, которые я нашел в Qt, используют оператор new. Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

Избегайте (необработанных) указателей настолько, насколько позволяют соображения производительности и ясности.Например, в вашем коде нет необходимости использовать указатели.Вместо этого определите вашу сцену как члена вашего класса:

class MyCalss
{
...
  QGraphicsScene scene;
};

И затем установите ее для вида:

MyClass myscene;

ui->graphicsView->setScene(&myscene.scene);

Итак, теперь, перед использованием указателей, задайте этот вопросвопрос от себя, Нужно ли использовать указатели? Если вам нужно использовать указатели, укажите в своих соображениях умные указатели .

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

Нет «конкретного» места для размещения нового и удаления.Это полностью зависит от того, где вам нужно динамическое распределение памяти (новая), и как только задание динамически распределенной памяти (переменная) закончится, вам нужно освободить это (удалить), имея в виду, что переменная больше нигде не будет использоватьсяэто может привести к нежелательному поведению.

Если при каждом создании объекта класса переменная класса должна динамически размещаться сразу после запуска, сделайте это в конструкторе.Аналогично, если переменная используется в течение всего времени существования объекта, удалите ее в деструкторе.Это просто идея очень высокого уровня.Я хотел бы предложить прочитать это , а также прочитать больше об указателях (интеллектуальных указателях) и динамическом распределении памяти

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