创建和访问指向 QObject 的指针的 QVector 的元素
Creating and accessing elements of a QVector of pointers to QObjects
我尝试将指向对象的指针添加到 QVector,但是当我稍后访问 QVector 时它似乎是空的。
这是代码的精简版本,问题是反派 class 的 QVector 是 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";
}
}
最终目标是获取每个minion的物品数量
#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 失败:"index out of range"
#include <QObject>
class Minion : public QObject
{
Q_OBJECT
public:
explicit Minion(QObject *parent = 0);
int getNumItems(){return items;}
private:
int items = 1;
};
那么,为什么 minions.append(new Minion()) 似乎可以工作,但每次我尝试访问它时 minions QVector 都显示为空?
方法 getVillain returns 一个 Villain 的副本。所以每次你有一个空的 QVector。你也有内存泄漏。您不管理 minions 矢量指针。
您应该通过引用在堆 (C++ - Why do I create these widgets on the heap?) 或 return 对象上创建 Villain。
您必须实现 Villain
复制构造函数。每次调用 EvilOrganisation::getVillain()
时,您将获得 class 成员的副本 - Villain
对象,默认情况下包含一个空的</code>QVector`。 </p>
<p>另一个想法是 return 引用你的 <code>Villain
就像
Villain& getVillain() {
return villain;
}
我尝试将指向对象的指针添加到 QVector,但是当我稍后访问 QVector 时它似乎是空的。
这是代码的精简版本,问题是反派 class 的 QVector 是 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";
}
}
最终目标是获取每个minion的物品数量
#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 失败:"index out of range"
#include <QObject>
class Minion : public QObject
{
Q_OBJECT
public:
explicit Minion(QObject *parent = 0);
int getNumItems(){return items;}
private:
int items = 1;
};
那么,为什么 minions.append(new Minion()) 似乎可以工作,但每次我尝试访问它时 minions QVector 都显示为空?
方法 getVillain returns 一个 Villain 的副本。所以每次你有一个空的 QVector。你也有内存泄漏。您不管理 minions 矢量指针。
您应该通过引用在堆 (C++ - Why do I create these widgets on the heap?) 或 return 对象上创建 Villain。
您必须实现 Villain
复制构造函数。每次调用 EvilOrganisation::getVillain()
时,您将获得 class 成员的副本 - Villain
对象,默认情况下包含一个空的</code>QVector`。 </p>
<p>另一个想法是 return 引用你的 <code>Villain
就像
Villain& getVillain() {
return villain;
}