【问题标题】:Creating and accessing elements of a QVector of pointers to QObjects创建和访问指向 QObjects 的指针的 QVector 的元素
【发布时间】:2017-10-16 04:05:25
【问题描述】:

我尝试将指向对象的指针添加到 QVector,但是当我稍后访问 QVector 时,它似乎是空的。

这是代码的精简版本,其中 Villain 类具有 Minion* 的 QVector。

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";
    }
}

最终目标是获取每个minion的物品数量

#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: "index out of range" 中的 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 都显示为空?

【问题讨论】:

    标签: c++ qt qvector


    【解决方案1】:

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

    另一个想法是只返回对您的 Villain 的引用,如

    Villain& getVillain() {
        return villain;
    }
    

    【讨论】:

    • 谢谢 bkausbk 这正是我正在寻找的答案。我确定我在 Minion 课上做错了什么,但现在我明白了。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 2023-02-16
      • 2020-01-10
      相关资源
      最近更新 更多