2017-10-16 4 views
0

オブジェクトへのポインタをQVectorに追加しようとしましたが、後でQVectorにアクセスすると空に見えます。QVectorへのポインタのQVectorの要素の作成とアクセス

ここでは、Villainクラスに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"; 
    } 
} 

究極の目標は、各手先

#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ミニオンを追加しますが、次の時間が関数であるから、項目の数を取得することですいわゆるミニオンは空です。

getMinion(int i)は、minions.at(i)が存在しないためプログラムをクラッシュします。エラーメッセージがある - QVectorに失敗したことをアサート::に:「インデックス範囲外」

#include <QObject> 

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

    int getNumItems(){return items;} 

private: 
    int items = 1; 
}; 

なぜ(新しいミニオンは())動作するように見えるが、手下は、すべての空の見えるQVector minions.appendありません私はそれにアクセスしようとする時間?

答えて

2

コピーコンストラクタVillainを実装する必要があります。 EvilOrganisation::getVillain()が呼び出されるたびに、クラスメンバーのコピー(Villainオブジェクト)が作成されます。このオブジェクトには、デフォルトで空の QVector`が含まれています。

もう一つのアイデアだけで、あなたのVillain

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

への参照を返すことであるあなたは、これは私が探していただけの答えですbkausbkありがとうございました。私は私のミニオンクラスで何か間違っていると確信していましたが、明らかになったようです。 – workdamnit

2

メソッドgetVillainは、Villainのコピーを返します。だから、空のQVectorがあるたびに。また、メモリリークがあります。ミニンベクトルポインタは管理しません。

ヒープで悪人(C++ - Why do I create these widgets on the heap?)を作成するか、参照によってオブジェクトを返す必要があります。

関連する問題