Comment initialiser QVector
Je suis novice en c++ et Qt et je suis en train d'initialiser un QVector, qui est un membre de la classe dans une classe de l'initialisation de la liste comme:
MyClass::MyClass(QWidget *parent) : QMainWindow(parent) , myVector(QVector<double>(100))
Je m'attendais à la QVector avoir déjà 100 index alocated, mais lorsque je tente de lire myVector[0]
j'obtiens une erreur d'assertion en disant "exception non Gérée à 0x0143bf77 dans test.exe: 0xC0000005: violation d'Accès lecture de l'emplacement 0x00000004." et le programme s'arrête à cette ligne de Qt:
inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
return data()[i]; }
Qui, je crois, montre que je suis en train d'essayer d'accéder aux membres qui ne sont pas affectés, de sorte que je suppose que je ne suis pas à l'aide de la liste d'initialisation correctement. Je pouvais en faire un pointeur et de faire un new QVector(100)
dans le constructeur, mais je veux savoir quel est le problème et comment puis-je faire corriger.
myVector(100)
dans le constructeur devrait suffireJe suis dans une boucle for, donc
first()
coutume de travailSi je ne
myVector(100)
j'obtiens l'erreur: valeur initiale de référence à la non-const doit être une lvalueafficher la déclaration de myVector.
OriginalL'auteur mFeinstein | 2014-01-05
Vous devez vous connecter pour publier un commentaire.
Vous avez probablement fait quelque chose de mal unshown parce que le code suivant fonctionne très bien pour moi, et il devrait par la conception. Notez que pour le premier élément, vous pouvez utiliser la commodité première méthode.
main.cpp
principal.pro
De sortie
Comme je l'ai noté dans le commentaire, vous pouvez utiliser le la méthode de réserve.
Donc, vous serait d'écrire quelque chose comme ceci:
Cependant, comme je l'ai indiqué plus loin dans le commentaire, le simple constructeur devrait également fonctionner comme:
Ce que vous faites est d'invoquer le constructeur de copie (bien que, pour un implicitement partagé de la classe), de sorte qu'il peut être très lente. Il est au moins plus de code que vous avez besoin.
&myVector
, afin de supprimer la référence de le faire fonctionner avec mon code d'origine, merci beaucoupheureux que vous avez fixé. Notez que c'est pourquoi j'ai demandé pour la déclaration.
Oui, j'ai oublié de vérifier la déclaration
OriginalL'auteur lpapp
Essayer quelque chose comme cela :
vide QVector::réserve(int taille)
Tente d'allouer de la mémoire pour au moins la taille des éléments. Si vous savez à l'avance la taille du vecteur sera, vous pouvez appeler cette fonction, et si vous appelez de redimensionnement() souvent, vous êtes susceptible d'obtenir de meilleures performances. Si la taille est une sous-estimation, le pire qui va arriver, c'est que le QVector sera un peu plus lent.
Le seul but de cette fonction est de fournir un moyen de réglage fin QVector l'utilisation de la mémoire. En général, vous aurez rarement besoin d'appeler cette fonction. Si vous souhaitez modifier la taille du vecteur, appel resize().
Mais ce ne réserve la mémoire, si vous souhaitez naviguer, utilisez
fill(<double>)
OriginalL'auteur Thomas Ayoub