Initialisation vector

AshOorTael Messages postés 4 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 20 décembre 2006 - 19 déc. 2006 à 10:00
AshOorTael Messages postés 4 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 20 décembre 2006 - 20 déc. 2006 à 11:41
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 déc. 2006 à 12:42
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
0
AshOorTael Messages postés 4 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 20 décembre 2006
19 déc. 2006 à 14:42
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 déc. 2006 à 15:16
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
0
AshOorTael Messages postés 4 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 20 décembre 2006
19 déc. 2006 à 15:51
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AshOorTael Messages postés 4 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 20 décembre 2006
20 déc. 2006 à 11:41
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
0
Rejoignez-nous