创建类时我应该在哪里放置new / delete

问题描述 投票:-3回答:2

我有一部分代码,我测试和工作,现在我想让它成为一个类,以便有一些更清洁的东西。以下代码创建一个包含矩形的场景,并将其显示在窗口小部件'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);

但是这段代码不起作用(widget'graphoutView'什么都没显示),我发现Qt的所有例子都使用new运算符。我错过了什么?

c++ qt
2个回答
2
投票

避免(原始)指针与性能和清晰度考虑因素一样多。例如,在您的代码中,没有必要使用指针。而是将您的场景定义为您的类的成员:

class MyCalss
{
...
  QGraphicsScene scene;
};

然后将其设置为视图:

MyClass myscene;

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

所以,从现在开始,在使用指针之前,先问自己这个问题,是否有必要使用指针?如果你必须使用指针,也可以考虑smart pointers


0
投票

新的和删除没有“特定”的地方。它完全取决于你需要动态分配内存的位置(新),一旦动态分配内存(变量)的作业结束,你需要释放(删除),记住该变量不会在其他任何地方使用因为它会导致不良行为。

如果在创建类的每个对象时,需要在开始时动态分配类变量,请在构造函数中执行。类似地,如果变量在整个对象生命周期中使用,请在析构函数中删除它。这只是一个非常高级的想法。我建议阅读this,并阅读有关指针(智能指针)和动态内存分配的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.