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

最佳答案

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

另一个想法是像这样返回对您的Villain的引用

Villain& getVillain() {
    return villain;
}

关于c++ - 创建和访问指向QObject的指针的QVector的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46762786/

10-11 22:08