Qt C++;重载解析选择删除的运算符'='; 所以我刚开始用C++,因为我需要和QT一起玩游戏。但我仍然没有意识到指针,所以我遇到了一些麻烦。我认为这个问题与指针有关,但实际上可能与QT有关
我在这个项目中有很多场景,所以我想知道哪一个场景当前处于活动状态。为此,我创建了一个类RoomController,因为每个场景都是一个房间的再现。它将是一个简单的类,存储一个QGraphicscene,还具有一个getter和setter方法 头文件Qt C++;重载解析选择删除的运算符'='; 所以我刚开始用C++,因为我需要和QT一起玩游戏。但我仍然没有意识到指针,所以我遇到了一些麻烦。我认为这个问题与指针有关,但实际上可能与QT有关,c++,qt,C++,Qt,我在这个项目中有很多场景,所以我想知道哪一个场景当前处于活动状态。为此,我创建了一个类RoomController,因为每个场景都是一个房间的再现。它将是一个简单的类,存储一个QGraphicscene,还具有一个getter和setter方法 头文件 #ifndef ROOMCONTROLLER_H #define ROOMCONTROLLER_H #include <QGraphicsScene> class RoomController: { private: QGr
#ifndef ROOMCONTROLLER_H
#define ROOMCONTROLLER_H
#include <QGraphicsScene>
class RoomController:
{
private:
QGraphicsScene currentRoom;
public:
RoomController();
QGraphicsScene getRoom() const;
void setRoom(QGraphicsScene room);
};
#endif // ROOMCONTROLLER_H
#如果没有房间控制器#
#定义房间控制器
#包括
教室管理员:
{
私人:
QG-SCene电流室;
公众:
RoomController();
qgraphicscene getRoom()常量;
空隙设置室(QS室);
};
#endif//ROOMCONTROLLER\u H
源文件
#include "RoomController.h"
#include <RoomA.h>
#include <QGraphicsScene>
RoomController::RoomController()
{
currentRoom = new RoomA();
}
char RoomController::getRoom() const
{
return currentRoom;
}
void RoomController::setRoom(QGraphicsScene room)
{
currentRoom=room;
}
#包括“RoomController.h”
#包括
#包括
RoomController::RoomController()
{
currentRoom=新RoomA();
}
char RoomController::getRoom()常量
{
回流室;
}
无效房间控制器::设置室(QG房间)
{
当前房间=房间;
}
不能按值返回QObject
s。用面向对象的说法,任何源于QObject
的东西都是一个QObject
(就像沃尔沃是一辆汽车)
您可以通过引用(首选)或指针返回qgraphicscene
。由于您还打算设置房间的场景,因此您必须决定谁拥有该场景-是您将所有权传递给房间,还是其他人拥有它?在Qt中,您可以使用QObject
来选择性地管理该所有权,即,如果场景没有父对象,您可以让RoomController
拥有该场景的所有权,但您必须首先将控制器设置为QObject
,而且您可能无论如何都想这样做,因为在Qt中大多数“控制器”需要是QObject
s才能利用事件系统、计时器等
#pragma once // simpler than the #ifdef juggle
#include <QGraphicsScene>
class RoomController : public QObject
{
Q_OBJECT
QGraphicsScene *currentRoom = nullptr;
public:
RoomController(QObject *parent = nullptr) : QObject(parent) {}
QGraphicsScene &getRoom() const { return *currentRoom; }
void setRoom(QGraphicsScene *room) {
Q_ASSERT(room); // this function is only meant to be used with a valid room
if (currentRoom && currentRoom->parent() == this)
delete currentRoom;
currentRoom = room;
if (!currentRoom->parent())
currentRoom->setParent(this);
}
};
#pragma once//比#ifdef杂耍更简单
#包括
类RoomController:公共QObject
{
Q_对象
QGraphicscene*currentRoom=nullptr;
公众:
RoomController(QObject*parent=nullptr):QObject(parent){}
qgraphicscene&getRoom()常量{return*currentRoom;}
无效设置室(QG-SCENE*室){
Q_ASSERT(room);//此函数仅用于有效的room
如果(currentRoom&¤tRoom->parent()==此)
删除当前房间;
当前房间=房间;
如果(!currentRoom->parent())
currentRoom->setParent(此);
}
};
这样,如果currentRoom
属于RoomController
,当控制器被销毁时,它将被QObject::~QObject()
自动删除
旁注:将所有这些微小的单行方法放在一个单独的
.cpp
文件中通常只会使源代码更难理解,因为尽管它做的很少,但它的数量却多得多。一行程序,尤其是访问器(getter/setter),应该保留在头中,因为它们不会以这种方式添加任何额外的源代码行。此外,在简单的项目中,也可以在头文件的类声明中保留短方法——同样,使项目的结构更简单。毕竟,您正在编写一个相当简单的项目,最好保存在一个.cpp
文件中,因为标题中的错误与您的代码有什么关系?请发布一条完整的错误消息QObject不可复制(如QGraphicscene),在这种情况下,您必须使用指针,将QGraphicscene
更改为QGraphicscene*