Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建类时,我应将新建/删除放在何处_C++_Qt - Fatal编程技术网

C++ 创建类时,我应将新建/删除放在何处

C++ 创建类时,我应将新建/删除放在何处,c++,qt,C++,Qt,我有一部分代码是我测试和工作的,现在我想把它变成一个类,以便有更干净的东西。 下面的代码创建一个包含矩形的场景,并将其显示在小部件“graphicview”上 QGraphicsScene *scene = new QGraphicsScene; QGraphicsRectItem *rect = new QGraphicsRectItem(); rect->setRect(0,0,100,100); scene->addItem(rect); ui->graphicsView

我有一部分代码是我测试和工作的,现在我想把它变成一个类,以便有更干净的东西。 下面的代码创建一个包含矩形的场景,并将其显示在小部件“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类中,我是否应该有一个声明为
qgraphicscene*scene=newqgraphicscene的私有参数
,或者只是一个私有参数
qgraphicscene*scene
,然后在构造函数中
*scene=new qgraphicscene

我应该在MyScene的析构函数中把delete放在哪里也是一样的

编辑:根据答案,我试图在没有新代码的情况下重新编写代码:

QGraphicsScene scene;
QGraphicsRectItem rect;
rect.setRect(0,0,100,100);
scene.addItem(&rect);
ui->graphicsView->setScene(&scene);
但是这段代码不起作用(小部件“graphicView”什么也不显示),我发现的所有Qt示例都使用了新的操作符。我遗漏了什么?

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

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

尽可能避免使用(原始)指针,因为您需要考虑性能和清晰度。例如,在代码中,不需要使用指针。相反,将场景定义为类的成员:

class MyCalss
{
...
  QGraphicsScene scene;
};
然后将其设置为视图:

MyClass myscene;

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

因此,从现在开始,在使用指针之前,先问自己一个问题,是否有必要使用指针?如果必须使用指针,也要考虑一下。

你不应该在任何地方放置
new
s或
delete
s。相反,你应该把C++的书打开到解释如何使用智能指针的章节,然后使用它们。“<代码> MyClass myscene有什么不对?”代码>?我不知道是否有错误,但是使用它们,我并不认为它们是错误的没有“特定”的地方放置新的和删除->没有地方放置新的和删除,因为不应该使用
new
delete
;)是的,正如他们在《现代C++》中所说的:p感谢答案。我的示例基于此(“MainWindow类实现”),我是否可以得出结论,Qt没有使用良好的编程实践,我不应该使用它们的示例?Qt是para-C++,它们需要一个元编译器(MOC)。从QObject派生的任何对象都会形成一个树,这样您就不需要
删除
。这是聪明和强大的,当它被发明,因为旧的C++没有更好的选择。但现在,它听起来比现代C++过时了。但Qt仍然很好。@sayanel Qt的例子很好。但是你最好提高你的C++知识。从示例中学习他们想要创建什么,而不是如何创建。其次,如果答案回答了你的问题,最好接受它D;)@s4eed好吧,我试图实现你的答案,但我没有实现(请参阅我对问题的编辑),因此它没有关闭now@sayanel我猜您是在构造函数中定义了已编辑的代码。所以在完成构造器后,场景将被破坏。将场景定义为类的成员。只要视图是活动的,场景就必须是活动的。因此,您必须
new
并在析构函数中删除它,或者使其成为类的成员。