2017-10-16 4 views
0

J'essaie d'ajouter des pointeurs sur des objets à un QVector mais lorsque j'accède au QVector plus tard, il semble être vide.Création et accès à des éléments d'un QVector de pointeurs vers QObjects

Voici une version allégée du code avec le problème où la classe Villain a un QVector of 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"; 
    } 
} 

Le but ultime est d'obtenir le nombre d'éléments de chaque sbire

#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() ajoute avec succès 1 Minion *, mais la prochaine fois que la fonction est appelé minions est vide. GetMinion (int i) bloque le programme car minions.at (i) n'existe pas. Lorsque le message d'erreur est - échec VALOIR dans QVector :: à: « indice hors de portée »

#include <QObject> 

class Minion : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Minion(QObject *parent = 0); 

    int getNumItems(){return items;} 

private: 
    int items = 1; 
}; 

Alors pourquoi ne minions.append (nouveau Minion()) semblent fonctionner, mais les sbires QVector semble vide tous les temps j'essaie d'y accéder?

Répondre

2

Vous devez implémenter le constructeur de copie Villain. Chaque fois que EvilOrganisation::getVillain() est appelée, vous obtenez une copie de votre objet de classe - l'objet Villain, qui contient un QVector` vide par défaut.

Une autre idée est de revenir juste une référence à votre Villain comme dans

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

Merci bkausbk c'est juste la réponse que je cherchais. J'étais sûr que je faisais quelque chose de mal dans ma classe Minion mais il semble évident maintenant je le vois. – workdamnit

2

Méthode getVillain renvoie une copie de Villain. Donc, chaque fois que vous avez un QVector vide. En outre, vous avez une fuite de mémoire. Vous ne gérez pas les pointeurs vectoriels de minions.

Vous devez créer Villain sur tas (C++ - Why do I create these widgets on the heap?) ou renvoyer un objet par référence.