IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Vector et constructeurs de classes


Sujet :

SL & STL C++

  1. #1
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut Vector et constructeurs de classes
    J'ai un petit problème, je voudrais faire un vector de classe, mais je vois pas comment faire avec le constructeur...


    C_Terrain.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #include "SDL_Event.hpp"
    #include "C_Case.hpp"
    #include "C_FileData.hpp"
     
     
    using namespace std;
     
    /*
     
    */
     
     
     
    class C_Terrain
    {
    private:
     
        //Taille de la map
        int LONGUEUR;
        int LARGEUR;
        int Pos_x;
        int Pos_y;
     
     
        vector<SDL_Surface *> m_ImgTexturesSol;
        vector<SDL_Surface *> m_ImgTexturesBord;
        vector<SDL_Surface *> m_ImgDecors;
        vector<SDL_Surface *> m_ImgCoffre;
        vector<SDL_Surface *> m_ImgCharset;
        SDL_Surface *Terrain;
        SDL_Events *m_pEvents;
        C_FileData *m_pFileData;
        TTF_Font *font;
     
        void Affichage_Decors(int const x, int const y);
        void Mise_a_jour();
     
        vector<C_Case> m_Case;
     
        int clicked;
     
    public:
     
        // Constructeur.
        C_Terrain(SDL_Events &Events, C_FileData &FileData);
     
        // Destructeur.
        ~C_Terrain();
     
        //Chargement des set
        int Init();
     
        //Chargement, Sauvegarde de maps
        int LoadMap(string fichier);
        int NewMap(int const largeur, int const longueur);
        int SaveMap(string Name);
     
        //Affichage
        void Affichage(SDL_Surface *cible);
     
        //Clic sur une case
        int Clic(int const numSritex, int const numSpritey, int const xsouris, int const ysouris, int const clic);
    };
     
    #endif
    Le constructeur de C_Case
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C_Case(SDL_Events &Event, C_FileData &FileData);
    J'avais pensé àa ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<C_Case> m_Case(m_pEvents, m_pFileData);
    Mais Code::Blocks me dit que m_pEvents et m_pFileData ne sont pas des types... o_O

    Merci d'avance de votre aide, vous devez etre probablement très patient avec toutes les questions -betes- que je pose

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il ne faut pas confondre construction du vecteur, et construction des éléments que tu vas y insérer.

    Lorsque tu ajoutes une case à ton tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_Case.push_back(C_Case(m_pEvents, m_pFileData));

  3. #3
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !

    normalement les vector ont un constructeur par défaut...

    qui crée un vector vide...

    ensuite, tu peux le remplir avec insert ou push_back...

    Si c'est pour faire un tableau de taille fixe, il vaut encore mieux utiliser un C_Case[], dans ce cas, il faut s'assurer que C_Case ait un constructeur par défaut.

    Si tu veux un tableau de taille fixe mais que tu ne peux pas mettre de constructeur par défaut à C_Case, il y a aussi un constructeur qui prend en paramètre la taille et une instance de C_Case qui servira à le remplir...

    ensuite, m_pEvents et m_pFileData sont des pointeurs, or ton constructeur attend des références, il faut donc extraire les références pour les passer (ajoute juste * devant)

    cependant, si comme je le soupsone, tu stockes les pointeurs vers les objets qui sont passés par référence au constructeur, il vaut mieux demander directement des pointeurs, parce que ce que tu stockes, c'est l'adresse, pas l'instance...

    cependant, si tu es sûr que tu n'auras jamais besoin de changer ce sur quoi pointe ces deux pointeurs, tu peux également les transformer en références... (et à ce moment là, demander des références dans le constructeur) ça permet d'éviter la syntaxe pénible liée aux pointeurs...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  4. #4
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Bon, alors, merci de vos réponses.

    Swoog : Case est évolutif, car ça dépend de la taille du terrain, c'est pour ça que j'ai choisi d'utiliser les vectors.
    Pour les pointeurs, ça fonctionne très bien comme j'ai fait, sans syntaxe trop compliquée.


    Par contre, pushback ajoute une case, hors, je préfererais qu'il se place sur une case fixe... List ne serait-il pas plus approprié ?

    Merci d'avance.

  5. #5
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    il y a insert si tu veux insérer à un endroit fixe...

    cependant, si ta case existe déjà (position < size - 1) il te suffit de faire :
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  6. #6
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Donc... Case[2]=C_Case Case(//constructeur ??

    Bon, après réflexion, je vais peut-etre utiliser push_back... Je vais voir.

  7. #7
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    si tu veux simplement construire ton vector avec un nombre de cases prédéfinies dans le constructeur de C_Terrain, il te suffit de le mettre ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C_Terrain::C_Terrain(SDL_Events &Events, C_FileData &FileData)
       :
    [liste d'initialisation], Case([size], [instance de C_Case qui servira à le remplir]), [fin liste d'initialisation]
    {
    <div style="margin-left:40px">[corps du constructeur]</div>}
    c'est à dire, si j'ai bien compris ce que tu souhaites faire, ton constructeur devrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C_Terrain::C_Terrain(SDL_Events &Events, C_FileData &FileData)
       :
    [liste d'initialisation], Case([size], C_Case(Events, FileData)), [fin liste d'initialisation]
    {
    <div style="margin-left:40px">[corps du constructeur]</div>}
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  8. #8
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Citation Envoyé par Swoög
    si tu veux simplement construire ton vector avec un nombre de cases prédéfinies dans le constructeur de C_Terrain, il te suffit de le mettre ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C_Terrain::C_Terrain(SDL_Events &Events, C_FileData &FileData)
       :[liste d'initialisation], Case([size], [instance de C_Case qui servira à le remplir]), [fin liste d'initialisation]
    {<div style="margin-left:40px">[corps du constructeur]</div>}
    c'est à dire, si j'ai bien compris ce que tu souhaites faire, ton constructeur devrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C_Terrain::C_Terrain(SDL_Events &Events, C_FileData &FileData)
       :[liste d'initialisation], Case([size], C_Case(Events, FileData)), [fin liste d'initialisation]
    {<div style="margin-left:40px">[corps du constructeur]</div>}
    Non, en fait, j'ai une fonction LoadMap qui charge les Cases, donc à chaque fois j'efface tout m_Case, puis je la resize en fonction de la taille du nouveau terrain, puis j'y insere la Class C_Case.

    EDIT : Comment utiliser insert() ?

  9. #9
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    ah

    dans ce cas, il te suffit d'appeller resize :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Case.resize([SIZE], C_Case(*m_pEvents, *m_pFileData);
    (si tu veux que TOUTES les C_Case de Case deviennent des C_Case(*m_pEvents, *m_pFileData), il faut avoir vider Case avant (avec un clear par exemple)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  10. #10
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Citation Envoyé par Swoög
    ah

    dans ce cas, il te suffit d'appeller resize :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Case.resize([SIZE], C_Case(*m_pEvents, *m_pFileData);
    (si tu veux que TOUTES les C_Case de Case deviennent des C_Case(*m_pEvents, *m_pFileData), il faut avoir vider Case avant (avec un clear par exemple)
    Génial ça !!

    Merci beaucoups

    Vraiment surpuissante la STL

  11. #11
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    De rien, comme je te l'ai déjà dit (il me semble que c'est à toi que je l'ai dit, non ?)
    dans la section tuto du site, il y a un excellent tuto sur la STL, il contient les signatures des classes conteneurs de la STL (vector, deque, list, map, set, mulimap et multiset) avec des explications sur chaque fonctions, quand utiliser quelle conteneur plutôt que tel autre, des exemples, etc...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  12. #12
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    C'est bien à moi que tu l'a dit, mais c'est un fichier pdf :-/ Je déteste lire les pdf... Enfin je ferais avec.

    Juste une question, pour :

    vector<map<int, int> > m_DataDecors;

    Pour y accéder, ce sera...

    m_DataDecors[NR_VECTOR][NR_MAP];

    ou

    m_DataDecors[NR_MAP][NR_VECTOR];

    ?

  13. #13
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    tu as un vecteur de map

    donc d'abord l'indice destiné au vecteur, ensuite celui destiné à la map :

    m_DataDecors[NR_VECTOR] te renvoies une map auquelle tu appliques [NR_MAP]

    grmbl, faut que je change les piles de ce **** de clavier...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  14. #14
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Bon, je passa à la phase debuggage du programme :-/ Autre avantage de la STL : on voit que c'est passé par des map ou des vector lors du tracage des fonctions

    Merci en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/05/2006, 08h07
  2. [POO] Constructeur de classe
    Par cescu dans le forum Langage
    Réponses: 7
    Dernier message: 14/02/2006, 21h50
  3. [débutant] vector et instances de class
    Par melvar dans le forum Langage
    Réponses: 4
    Dernier message: 11/02/2006, 23h49
  4. Réponses: 7
    Dernier message: 15/07/2005, 15h07
  5. [debutant] représentation vector dans diagramme de class
    Par onap dans le forum Diagrammes de Classes
    Réponses: 5
    Dernier message: 23/12/2004, 22h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo