创建和访问指向QObjects的QVector元素

时间:2017-10-16 04:05:26

标签: c++ qt qvector

我尝试将对象的指针添加到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都显示为空?

2 个答案:

答案 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;
}