Initialisation vector

Signaler
Messages postés
4
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
20 décembre 2006
-
Messages postés
4
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
20 décembre 2006
-
Bonjour,

J'ai une classe Case et je souhaiterais stocker ces Case dans un vecteur.

Donc dans le fichier Moteur.h :
class Moteur
{
 private:
    std::vector<Case> caseList;
[...]
};

Dans le fichier Moteur.cpp:
#include "Moteur.h"
Moteur::Moteur()
{
 caseList;
 [...] 
}

Mais lorsque je veux ajouter des elements au vecteur caseList avec push_back, le programme plante. On dirait que caseList n'est pas créé en memoire.

J'ai essayé de faire un reserve mais cela ne change rien et je n'ai plus d'idée.

Auriez vous des conseils?

Merci par avance. 

Ash Oor T'ael

5 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ton "instruction" caseList; dans le constructeur ne sert à rien. Par défaut, ton vecteur est automatiquement instancié, avec le constructeur par défaut, tu n'a rien a faire.
C'est comme si tu écrivais:
Moteur::Moteur(): caseList(std::vector<Case>())
{
}

Le problème peut venir du constructeur de Case, ou bien du constructeur par copie

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
4
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
20 décembre 2006

Merci,

Je pensais bien que cela ne servait à rien, mais c'est toujours bon d'en avoir le confirmation

Sinon voila le constructeur par défault:

Case::Case()
{
    pos.x = 0;
    pos.y = 0;
    pos.w = 0;
    pos.h = 0;
    fade = 0;
    alpha = 255;
    joueur = 0;               
}

pos est un SDL_Rect et le reste des int.

Le constructeur par copie est obligatoire? Si oui, a quoi devrait il ressemblé.

Ash Oor T'ael
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Comme tu n'a que des valeurs entières, je ne pense pas que tu ais besoin de ce constructeur par recopie.
Peux-tu connaitre exactement l'endroit qui fait planter ton programme?

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
4
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
20 décembre 2006

oui, je te met le debut de la fonction:

 std::vector<std::string> wFileList = file->getFileList();//renvoi un vecteur contenant le chemin de plusieurs fichiers
 SDL_Rect r;
 std::vector caseRemplie;
 int caseIdx = 0;
 int interCell = 10;
 int x = interCell;
 int y = interCell;
 int cols = getMaxCols(wFileList.size()*2); // permet d'obtenir le nombre le colonne en fonction du nombre de fichier OK.
 int lines =  (wFileList.size()*2)/cols; //nombre de ligne
 int width = (int)((WIDTH-(cols*interCell))/cols); //taille des cases
 int height = (int)((HEIGHT-(lines*interCell))/lines); // taille des cases
 
 caseRemplie = fillBoard(wFileList.size()*2); //rempli le vecteur avec des int aleatoires distincts
    std::cout << caseList.capacity()<<"\n"; //affiche 0
 caseList.reserve(wFileList.size()*2);
 std::cout << caseList.capacity()<<"\n"; affiche 20 car 10 fichiers *2
caseList.at(0)->setID("1"); plante  ici.

J'ai enlevé le try catch.
Je souhaiterais repartir aléatoirement les noms de fichiers dans les cases du vecteur,mais j'avoue avoir du mal.
Est ce qu'avec un std::fill cela passerais mieux, je vais essayé.

Merci pour ton aide.

Ash Oor T'ael
Messages postés
4
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
20 décembre 2006

non, cela ne mache pas donc j'ai fait une boucle

for (int i=0;i<wFileList.size()*2;i++)
    {
        caseList.push_back(new Case());
    }

qui marche.

Sinon  je ne sais toujours pas d'ou vient mon problème.
Ash Oor T'ael