2017-10-16 75 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?)或通過引用返回對象。

相關問題