我尝试将对象的指针添加到QVector,但是当我稍后访问QVector时,它似乎是空的。
以下是代码的精简版,其中的问题是Villain类有一个QVector of Minion *。
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 Minion *但下次调用该函数时minions为空。
getMinion(int i)崩溃了程序因为minions.at(i)不存在。 错误消息的位置--QVector :: at中的ASSERT失败:“索引超出范围”
#include <QObject>
class Minion : public QObject
{
Q_OBJECT
public:
explicit Minion(QObject *parent = 0);
int getNumItems(){return items;}
private:
int items = 1;
};
那么为什么minions.append(新的Minion())似乎有效,但每当我尝试访问时,minions QVector都显示为空?
答案 0 :(得分:2)
方法getVillain返回Villain的副本。所以每次你有一个空的QVector。你也有内存泄漏。你不管理minions矢量指针。
你应该在堆上创建恶棍(C++ - Why do I create these widgets on the heap?)或通过引用返回对象。
答案 1 :(得分:2)
您必须实现Villain
复制构造函数。每次调用EvilOrganisation::getVillain()
时,您都会获得一个类成员的副本 - Villain
对象,默认情况下包含空 QVector`。
另一个想法是在
中返回对Villain
的引用
Villain& getVillain() {
return villain;
}