簡體   English   中英

創建和訪問指向QObject的指針的QVector的元素

[英]Creating and accessing elements of a QVector of pointers to QObjects

我嘗試將指向對象的指針添加到QVector,但是稍后訪問QVector時,它似乎為空。

這是該代碼的精簡版本,其中的問題是Villain類的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";
    }
}

最終目標是從每個仆從中獲得物品數量

#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 *,但是下次調用該函數時卻為空。

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(new Minion())都可以,但是minions QVector卻為空?

方法getVillain返回反派的副本。 因此,每次您有一個空的QVector時。 另外,您還有內存泄漏。 您不管理奴才矢量指針。

您應該在堆上創建反派( C ++-為什么在堆上創建這些小部件? )或按引用返回對象。

您必須實現Villain復制構造函數。 每次EvilOrganisation::getVillain()被調用,你會得到你的類成員的一個副本-的Villain對象,其中包含一個空 默認情況下是QVector`。

另一個想法是像這樣返回對您的Villain的引用

Villain& getVillain() {
    return villain;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM