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

C++ Discussion :

manipuler un vector de type "classe"


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Par défaut manipuler un vector de type "classe"
    Bonsoir,

    Je suis entrain de faire un interface en utilisant la SDL, et pour la création et positionnement des icônes j'utilise un vector afin de pouvoir ajouter ou retirer facilement des icônes. C'est l'utilisateur qui choisis les icones en éditant un fichier texte de cette syntaxe:
    - La première ligne contient le nombre d’icône, exemple: 2
    - Cette ligne contient la commande pour exécuter l'application, exemple: kodi
    - Cette ligne contient le nom du fichier image, exemple: Kodi.png
    (et ainsi de suite)


    J'ai donc aussi une classe icone dont le constructeur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Icone::Icone(SDL_Surface* _affichage, int _r, int _g, int _b, int _x, int _y, char* _commande, char* _pathIcone)
    commande étant la commande décrit plus haut, et pathIcone est en fait le nom du fichier
    cette classe contient une methode dessinIcone()

    J'ai initialisé un vector de mon type Icone:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Icone> tabIcone;
    Je fais une lecture de fichier pour créer les icones:
    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
     
    	if(fichier)
    	{
    		int nbApp;
    		std::string icone, commande, strNbApp;
    		getline(fichier, strNbApp);
    		if(!(std::istringstream(strNbApp) >> nbApp) ) nbApp = 0;
    		std::cout << "nb app: " << nbApp << std::endl;
     
    		for(unsigned int i = 0; i<nbApp; ++i)
    		{
    			getline(fichier, commande);
    			getline(fichier, icone);
    			nomIcone = (char*)icone.c_str(); //Conversion des string en char* pour les paramètres du constructeur
    			commandeIcone = (char*)commande.c_str();
    			tabIcone.emplace_back(affichage, 0, 0, 0, 20*i, (maxH/10)+20, commandeIcone, nomIcone); //Constructeur
    		}
    	}
    Une fois le vector remplis, je l'appelle dans une fonction dessinerInterface() qui permet de dessiner différents élèments de l'interface dont les icones (j'ai allégé la fonction avec seulement les élèments qui nous intéressent):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void dessinerInterface(std::vector<Icone>& tabIcone)
    {
    	for(unsigned int i=0; i<tabIcone.size(); ++i)
    	{
    		(tabIcone.at(i)).dessinIcone(); //Appel de la méthode de dessin
     
    	}
     
     
    }
    Pour cette partie j'ai aussi essayé avec un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(auto &icone: tabIcone) ///Permet d'appliquer la methode � tout les mobs
            {
                      icone.dessinIcone();
            }
    Le problème c'est que les icônes n'apparaissent pas à l'écran mais les autres éléments de l'interface oui, et si je crée les icônes "a la main" en instanciant et en appelant la méthode dessinIcone() en dur les icônes que je veux ça marche. Je ne vois pas d’où viens le problème et j'ai déjç utilisé une technique similaire dans un autre projet sans souci.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    le vector contient une copie des icones que tu lui demande de dessiner, il est probable que ces copies ne soient pas correctement configurées.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Par défaut
    Je comprend pas trop ta réponse, je ne vois pas ou je fais une copie et comment elles pourraient être mal configurées du coup

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    C'est dû au fonctionnement de strd::vector.
    Vu qu'il lui arrive de devoir redimensionner son buffer interne lors de l'ajout de nouveaux éléments, il copie les éléments depuis son ancien buffer vers son nouveau buffer.
    Le fait qu'un type soit copiable est une des conditions pour pouvoir définir un std::vector de ce type.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    C'est dû au fonctionnement de str::vector.
    Vu qu'il lui arrive de devoir redimensionner son buffer interne lors de l'ajout de nouveaux éléments, il copie les éléments depuis son ancien buffer vers son nouveau buffer.
    Le fait qu'un type soit copiable est une des conditions pour pouvoir définir un std::vector de ce type.
    Cela devrait aussi être gérable avec la sémantique de mouvement, non?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Par défaut
    J'ai compris pour le push.back(), mais dans mon cas je fais un emplace.back(), le comportement est le même ?

  7. #7
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Cela devrait aussi être gérable avec la sémantique de mouvement, non?
    Oui, avec emplace_back, non?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Quand tu fais un push_back, le vector crée un nouveau Icone, en utilisant le constructeur par copie avec l'Icone que tu lui donnes.
    Si tu fais une transformation à l'Icone que tu as donné au push_back, elle n'est pas répercuté à la copie située dans le vector.

    En gros, si tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<Icone> icones;
    Icone i(...);
    icones.push_back(i);
    i.setRotation(15);
    for(auto const& icone: icones) icone.draw();
    l'icone affichée n'est pas tournée.

    La solution pratique serait de passer par la référence retournée par vector::back().

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

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