创建和访问指向QObject的QVector指针的元素
问题描述:
我尝试将对象指针添加到QVector,但是当我稍后访问QVector时,它看起来是空的。创建和访问指向QObject的QVector指针的元素
这里是一个精简版的代码,其中的恶棍类有一个Q的向量*。
void Widget::mainFunction()
{
int totalMinions = 5;
for(int i = 0; i < totalMinions; i++)
{
evilOrganisation.getVillain().addMinion();
}
for(int i = 0; i < totalMinions; i++)
{
qDebug() << "Minion " << i << " Has " << evilOrganisation.getVillain().getMinion(i)->getNumItems()<< " items";
}
}
的最终目标是从每个仆从获得的项目数量
#include <QObject>
#include "villain.h"
class EvilOrganisation : public QObject
{
Q_OBJECT
public:
explicit EvilOrganisation(QObject *parent = 0);
Villain getVillain(){return villain;}
private:
Villain villain;
};
__
#include <QVector>
#include "minion.h"
class Villain
{
public:
Villain();
void addMinion(){minions.append(new Minion());}
Minion* getMinion(int i){return minions.at(i);}
private:
QVector<Minion*> minions;
};
addMinion()成功追加1爪牙*但下一次的功能所谓的奴才是空的。
getMinion(int i)因为minions.at(i)不存在而崩溃程序。 当错误消息是 - ASSERT失败QVector ::在:“索引超出范围”
#include <QObject>
class Minion : public QObject
{
Q_OBJECT
public:
explicit Minion(QObject *parent = 0);
int getNumItems(){return items;}
private:
int items = 1;
};
那么,为什么minions.append(新爪牙())似乎工作,但爪牙QVector显示为空每我试图访问它吗?
答
您必须实现Villain
复制构造函数。每次调用EvilOrganisation::getVillain()
时,都将获得您的班级成员 - Villain
对象的副本,默认情况下该对象包含空的 QVector`。
另一个想法是只是一个参考返回到您Villain
像
Villain& getVillain() {
return villain;
}
答
getVillain方法返回恶棍的副本。所以每次你有一个空的QVector。你也有内存泄漏。你不管理小兵矢量指针。
您应该在堆上创建恶棍(C++ - Why do I create these widgets on the heap?)或通过引用返回对象。
谢谢bkausbk这就是我一直在寻找的答案。我确信我在Minion课上做错了事,但现在我明白了。 – workdamnit