2017-10-16 141 views
0

我尝试将对象指针添加到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显示为空每我试图访问它吗?

回答

2

您必须实现Villain复制构造函数。每次调用EvilOrganisation::getVillain()时,都将获得您的班级成员 - Villain对象的副本,默认情况下该对象包含空的 QVector`。

另一个想法是只是一个参考返回到您Villain

Villain& getVillain() { 
    return villain; 
} 
+0

谢谢bkausbk这就是我一直在寻找的答案。我确信我在Minion课上做错了事,但现在我明白了。 – workdamnit

2

getVillain方法返回恶棍的副本。所以每次你有一个空的QVector。你也有内存泄漏。你不管理小兵矢量指针。

您应该在堆上创建恶棍(C++ - Why do I create these widgets on the heap?)或通过引用返回对象。