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++

  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

  8. #8
    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 comprend pas trop ce que tu veux dire l� ?
    Enfaite j'ai une class Spell contenant un vector de jet de dommages, un autre vector de jet de dommades critiques et un nom.
    J'ai plusieurs methodes dont une qui sert � r�cup�r� une attaque g�n�r� de Spell et l'autre methode est attacksInfo (ou un truc du genre, j'ai pas le porjet sous mes yeux ) qui elle va renvoyer toutes les caract�ristiques du sort pour par la suite afficher ses ces caract�ristiques via une IHM. attacksInfo h�rite de Attackable car certains monstre n'ont pas de sort mais une armes et donc pas le m�me fonctionnement. Je sais pas si je suis tr�s clair x)

  9. #9
    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
    Citation Envoy� par Disixlis Voir le message
    l'autre methode est attacksInfo [...] qui elle va renvoyer toutes les caract�ristiques du sort pour par la suite afficher ses ces caract�ristiques
    Justement ton truc avec using correspond bien � cela: coder un truc pour relier plusieurs "objets" (un sort, une table de dommages et une table de dommages critiques)

    Ce que je voulais dire c'est que, de loin, cela semble foireux. D'accord cela se code vite, style "quick-and-dirty", mais cela ne semble pas terrible.

    Donc je te proposais de continuer � r�fl�chir pour [commencer �] refaire cette partie avec une classe qui propose plus de coh�sion voire qui se rapproche �ventuellement d'une base de donn�es.

    Mais, il n'y a que toi qui peux juger si ton using tient la route ou pas

  10. #10
    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
    Oui ce using est fait pour coder plus rapidemment, je veux bien le changer mais je ferai une classe de ce genre l� du coup ? :
    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
     
    class AttackInfo
    {
    public:
     
        AttackInfo(...);
        DmgRoll normal() const;
        DmgRoll crit() const;
        std::string nom() const;
     
    private:
     
    DmgRoll const normal;
    DmgRoll const crit;
    std::string const nom;
     
    };
    Et il vaudrai mieux que je ne fasse pas de copie, donc je devrais utiliser des pointeur, mais je n'ai jamais su utiliser correctement un pointeur intelligent x)
    Peut tu peux m'expliquer comment bien m'y prendre ?

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