2017-10-16 1 views
0

Ich versuche, einem QVector Zeiger auf Objekte hinzuzufügen, aber wenn ich später auf den QVector zugreife, scheint er leer zu sein.Erstellen und Zugreifen auf Elemente eines QVectors von Zeigern auf QObjects

Hier ist eine abgespeckte Version des Codes mit dem Problem, wo die Villain-Klasse einen QVector von Minion * hat.

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

Das ultimative Ziel ist es, die Anzahl der Elemente von jedem Günstling

#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() erfolgreich anhängt 1 Minion * zu erhalten, aber das nächste Mal die Funktion genannt Minions ist leer.

getMinion (int i) stürzt das Programm ab, da minions.at (i) nicht existiert. Wo ist die Fehlermeldung - Fehler in QVector ASSERT :: an: "index out of range"

#include <QObject> 

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

    int getNumItems(){return items;} 

private: 
    int items = 1; 
}; 

Warum (neu Minion()) erscheinen, aber die Schergen funktionieren minions.append QVector jeder leer erscheinen Mal versuche ich darauf zuzugreifen?

Antwort

2

Sie müssen den Villain Copy-Konstruktor implementieren. Jedes Mal, wenn EvilOrganisation::getVillain() aufgerufen wird, erhalten Sie eine Kopie Ihres Klassenmembers - das Objekt Villain, das standardmäßig einen leeren QVector enthält.

ist eine andere Idee, nur einen Verweis auf Ihre Villain wie Rückkehr in

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

Danke bkausbk dies nur die Antwort für die ich suchte. Ich war mir sicher, dass ich in meiner Minion-Klasse etwas falsch gemacht habe, aber es scheint jetzt offensichtlich, dass ich es sehe. – workdamnit

2

Methode getVillain gibt eine Kopie von Villain zurück. Also jedes Mal, wenn Sie einen leeren QVector haben. Außerdem haben Sie ein Speicherleck. Sie verwalten keine Minions-Vektorzeiger.

Sie sollten Villain auf Heap erstellen (C++ - Why do I create these widgets on the heap?) oder Objekt als Referenz zurückgeben.

Verwandte Themen