创建和访问指向 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;
}