我要在另一个内部构造的类遇到问题。我是C ++的新手(来自Java),我不明白为什么我的头文件不好...
为了简短起见,我正在创建一个应用程序,该应用程序可以创建,编辑和保存并加载由墙壁制成的地图。我编写了一个Wall类,该类接收MainWindow上的参数以及QGraphicsScene,以便将Wall类链接到其图形表示形式。 我在图形方面使用Qt。当我刚接触它时,事情往往会在我手中爆炸。 MainWindow具有createWall()函数,每当QDialog发出accepted()并将其数据收集并发送到该函数时,就会调用该函数。
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";
}
wall.h中的3个错误:
/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
^~~~
也许我在这里做的非常愚蠢……我已经搜索过了,看来我的构造函数根本不起作用,因为默认情况下它被删除了。但是我想我已经正确初始化了,不是吗?
答案 0 :(得分:0)
您很困惑,因为您的类有一个私有成员QGraphicsRectItem rect;
,而构造函数有一个局部变量QGraphicsRectItem *rect;
。
将您的类的rect
更改为指针,删除构造函数主体中的QGraphicsRectItem *rect;
声明行,就可以了。
为防止内存“泄漏”,应删除析构函数中的QGraphicsRectItem
。 (它不会泄漏内存,因为所有项目都归场景所有,但是这些项目将在您的场景中开始聚集。)