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 :

Using et std::vector


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut Using et std::vector
    Bonjour tout le monde J'ai un petit problème, dans mon programme j'ai une méthode comme ceci ( venant de la class Attackable ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual AttackInfo attacksInfo() const = 0;
    Dans un fichier hpp j'ai défini AttackInfo comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    using AttackInfo = std::vector<std::tuple<std::string, std::vector<DmgRoll>, std::vector<DmgRoll>>>;
    Il faut comprendre le code comme ceci : Vecteur de plusieurs type de dégat( nom du sort ou arme/ jet de dégâts de l'arme ou du sort, jet de dégâts critiques de l'arme ou du sort )

    Ma classe Player héritent de Attackable et voici attacksInfo() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    AttackInfo Player::attacksInfo() const //à opti
    {
        ///using AttackInfo = std::vector<std::tuple<std::string, std::vector<DmgRoll>, std::vector<DmgRoll>>>;
        AttackInfo atkInfo;
        for( size_t i{0}; i < player_spells.size(); ++i )
        {
            atkInfo[i].push_back( make_tuple(player_spells[i].name(), player_spells[i].spellDmg(), player_spells[i].spellDmgCrit()) );
        }
        return atkInfo;
    }
    J'ai l'erreur suivante : "push_back() ne fait pas partie de AttackInfo" Using ne garde pas les méthodes des différents objets ci dessus ? Cela me paraît très bizarre x)

    Merci d'éclairer ma lanterne :p

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    atkInfo[i] n'est pas un AttackInfo, mais un std::tuple qui n'a pas de méthode push_back, d'où l'erreur de compilation.

    A part ça, pour faire un code plus maintenable, pour définir ta classe AttackInfo, il me semble plus raisonnable de faire de l'encapsulation, en définissant une classe AttackInfo dont toutes les données seront en visibilité private.

    Par exemple, peut-être que, un jour, tu ne voudras plus sauvegarder les données sous la forme d'un std::vector<std::tuple<std::string, std::vector<DmgRoll>, std::vector<DmgRoll>>>, mais sous la forme d'un std::map<std::string, std::vector<std::pair<DmgRoll, DmgRoll>>>.
    Ou alors, peut-être que, un jour, tu voudras ajouter un invariant à la classe AttackInfo, par exemple le fait que ses std::string soient non vides.
    Dans les deux cas, le changement sera plus rapide à faire si, dès le départ, tu as fait de l'encapsulation.

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut
    Mais si je fait std::get<0>(atkInfo).push_back cela ne devrait pas fonctionner non plus non ? enfin bref je vois pas comment y accédé à chaque éléments de mon vecteur ^^". Et au début j'avais coder directement une classe AttackInfo, mais comme elle était vachement vide je me suis dit que en attendant je devrais faire un nouveau type via using . Donc comment je dois résoudre mon problème actuellement ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    atkInfo[i] n'est pas un AttackInfo mais un élément de ton vecteur AttackInfo, alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        AttackInfo atkInfo( player_spells.size() );
        for( size_t i{0}; i < player_spells.size(); ++i )
        {
            atkInfo[i] = make_tuple(player_spells[i].name(), player_spells[i].spellDmg(), player_spells[i].spellDmgCrit());
        }
    ou
        AttackInfo atkInfo;
        for( size_t i{0}; i < player_spells.size(); ++i )
        {
            atkInfo.push_back( make_tuple(player_spells[i].name(), player_spells[i].spellDmg(), player_spells[i].spellDmgCrit()) );
        }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Disixlis Voir le message
    Mais si je fait std::get<0>(atkInfo).push_back cela ne devrait pas fonctionner non plus non ?
    Non puisque atkInfo n'est pas un tuple mais un vector, comme on l'a déjà montré 2 fois

    Citation Envoyé par Disixlis Voir le message
    enfin bref je vois pas comment y accédé à chaque éléments de mon vecteur ^^".
    Ton truc est trop complexe et surement inutilement complexe. Tu as un vecteur de tuple qui contient lui-même 2 vecteurs... on sait même pas de quel vecteur tu parles.
    Dans AttackInfo atkInfo; atkInfo est un vector, atkInfo[i] est un tuple, fin de l'histoire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut
    Je viens de relire la connerie que j'ai écrit et c'est bon je sais quoi faire. Ma question n'a vraiment pas lieu d'être. Je crois que je devrais arrêté de rush pendant plusieurs heures et je devrai réfléchir avant de poser une question c*n. Veuillez m'excuser mais merci quand même pour vos réponses

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Et au passage, si tu réfléchis pense à refaire ton code avec une classe contenant une chaîne et 2 tableaux de dommages et ensuite définir AttackInfo comme un tableau de cette classe

Discussions similaires

  1. std::vector : dynamique ou statique, pile et tas
    Par salseropom dans le forum SL & STL
    Réponses: 7
    Dernier message: 24/01/2005, 13h22
  2. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  3. char[50] et std::vector<>
    Par tut dans le forum SL & STL
    Réponses: 9
    Dernier message: 12/10/2004, 13h26
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30

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