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

Langage C++ Discussion :

vector et string


Sujet :

Langage C++

  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut vector et string
    bonjour à tous,

    j'ai ces deux fichiers:
    menu:
    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
    #ifndef menu
    #define menu
     
    #include <string>
    #include <vector>
     
    class menu{
       private:
          vector<std::string> options;
          int compteur;
       public:
          menu();
          void ajouterOpion(std::string chaineOption);
          void affiche() const;
          int demanderOption() const;
    }
    #endif
    menu.cpp:
    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
    #include "menu"
     
    #include <iostream>
    #include <string>
    using namespace std;
     
     
    menu::menu:compteur(0){}
     
    void menu::ajouterOption(string chaineOption){
       options[compteur++]=chaineOption;
    }
     
    vois menu::affiche() const {
       for(int i(1);i<=compteur;i++)
          cout<<i<<"-"<<options[i-1]<<endl;
    }
     
    int menu::demanderOption() const {
       int i;
       do{
          affiche();
          cout<<"Quel est votre choix? ";
          cin>>i;
          if(i<1)
             cout<<"Pas de valeur nulle ou négatie. Recommencer"<<endl;
          else if(i>compteur+1)
             cout<<"Choix hors limite"<<endl;
       }
       while(i<1||i>compteur+1);
       return i;
    }
    voici quand je compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    In file included from menu.cpp:1:
    menu:9: error: ISO C++ forbids declaration of ‘vector’ with no type
    menu:9: error: expected ‘;’ before ‘<’ token
    menu:12: error: expected unqualified-id before ‘)’ token
    In file included from /usr/include/c++/4.4/bits/ios_base.h:43,
                     from /usr/include/c++/4.4/ios:43,
                     from /usr/include/c++/4.4/ostream:40,
                     from /usr/include/c++/4.4/iostream:40,
                     from menu.cpp:3:
    /usr/include/c++/4.4/bits/locale_classes.h:45: error: expected unqualified-id before ‘namespace
    comment faire un tableau dynamique dont les éléments sont de la classe string?

    quelqu'un a une idée?

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    Voici quelques corrections:
    Dans menu, à la ligne 9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::string> options;
    Dans menu, à la ligne 12 (constructeur par défaut avec liste d'initialisation) (c'est ce qui est fait par défaut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menu() : compteur(0) { }
    Dans menu, à la ligne 16 (ne pas oublier le ;)
    Dans menu.cpp, supprime la ligne 8 (qui est fausse syntaxiquement)
    Dans menu.cpp, à la ligne 11
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       options.push_back(chaineOption);
    Dans menu.cpp, remplace les lignes 15 et 16 par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       for (std::size_t i = 0; i < v.size(); ++i)
          cout << i << "-" << options[i] << endl;
    Je te conseille de faire un tour par la FAQ C++ http://cpp.developpez.com/faq/cpp/
    Classes: http://cpp.developpez.com/faq/cpp/?page=classes
    Namespace : http://cpp.developpez.com/faq/cpp/?page=namespace
    La STL (pour std::vector) : http://cpp.developpez.com/faq/cpp/?page=STL

    Pour l'utilisation de std::vector, pour ajouter un élément, soit :
    - on a déja réservé la taille, et on utilise v[i] = value; .
    - on veut ajouter un élément, et on utilise v.push_back(value); .
    Ta variable compteur a l'air inutile car elle fait la même chose que v.size() (?)
    Pour plus de détails, regarde :
    - http://www.cplusplus.com/reference/vector/vector/
    - http://en.cppreference.com/w/cpp/container/vector

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je te conseille également, et très fortement, de renommer ton fichier "menu" en "menu.h" (et du coup, de modifier, dans menu.cpp, le par )

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    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 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Dans menu.cpp, supprime la ligne 8 (qui est fausse syntaxiquement)
    Cette ligne est tout à fait correcte syntaxiquement parlant.

    Le problème initial vient juste du fait que vector fait partie du namespace std, tout comme string que tu as bien écrit.
    Les autres remarques sont toutefois légitimes, en particulier concernant le push_back !
    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.

  5. #5
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    merci pour vos cntributions

    j'ai fait les modifications (je croyais que l'extension ".h" était du C)

    Ehonn: quand tu dis v.size(), je dois utiliser options.size()?

    maintenant, le compilateur me parle de classe anonyme ne pouvant pas supporter les méthodes et ne reconais plus le tableau "options"

    cela vous dit quelque chose?

    menu.cpp
    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
    #include "menu.h"
     
    #include <iostream>
    #include <string>
    using namespace std;
     
     
     
     
    void menu::ajouterOption(string chaineOption){
       options.push_back(chaineOption);
    }
     
    void menu::affiche() const {
       for (std::size_t i = 0; i < options.size(); ++i)
          cout << i << "-" << options[i] << endl;
    }
     
    int menu::demanderOption() const {
       int i;
       do{
          affiche();
          cout<<"Quel est votre choix? ";
          cin>>i;
          if(i<1)
             cout<<"Pas de valeur nulle ou négatie. Recommencer"<<endl;
          else if(i>options.size())
             cout<<"Choix hors limite"<<endl;
       }
       while(i<1||i>option.size);
       return i;
    }
    menu.h
    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
    #ifndef menu
    #define menu
     
    #include <string>
    #include <vector>
     
    class menu{
       private:
          std::vector<std::string> options;
     
       public:
          void ajouterOpion(std::string chaineOption);
          void affiche() const;
          int demanderOption() const;
    };
    #endif
    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
    In file included from menu.cpp:1:
    menu.h:7: error: an anonymous struct cannot have function members
    menu.h:9: error: member ‘std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > <anonymous class>::options’ with constructor not allowed in anonymous aggregate
    menu.h:9: error: member ‘std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > <anonymous class>::options’ with destructor not allowed in anonymous aggregate
    menu.h:9: error: member ‘std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > <anonymous class>::options’ with copy assignment operator not allowed in anonymous aggregate
    menu.h:15: error: abstract declarator ‘<anonymous class>’ used as declaration
    menu.cpp:10: error: explicit qualification in declaration of ‘void ajouterOption(std::string)’
    menu.cpp: In function ‘void ajouterOption(std::string)’:
    menu.cpp:11: error: ‘options’ was not declared in this scope
    menu.cpp: At global scope:
    menu.cpp:14: error: explicit qualification in declaration of ‘void affiche()’
    menu.cpp:14: error: non-member function ‘void affiche()’ cannot have cv-qualifier
    menu.cpp: In function ‘void affiche()’:
    menu.cpp:15: error: ‘options’ was not declared in this scope
    menu.cpp: At global scope:
    menu.cpp:19: error: explicit qualification in declaration of ‘int demanderOption()’
    menu.cpp:19: error: non-member function ‘int demanderOption()’ cannot have cv-qualifier
    menu.cpp: In function ‘int demanderOption()’:
    menu.cpp:27: error: ‘options’ was not declared in this scope
    menu.cpp:30: error: ‘option’ was not declared in this scope

  6. #6
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    j'avais bien pensé au push_back, mais après avoir posté le message...
    Sinon, si on indique using namespace std, on est quand-même obligé d'écrire std::size_t au lieu de size_t?

  7. #7
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    Je te conseille également, et très fortement, de renommer ton fichier "menu" en "menu.h" (et du coup, de modifier, dans menu.cpp, le par )
    Ou menu.hpp c'est plus joli ^^

    Citation Envoyé par Bousk Voir le message
    Cette ligne est tout à fait correcte syntaxiquement parlant.
    Je ne savais pas qu'on pouvait omettre les parenthèses dans menu::menu:compteur(0){}
    Citation Envoyé par matser Voir le message
    j'ai fait les modifications (je croyais que l'extension ".h" était du C)
    En C++, l'extension n'a pas d'importance pour les fichiers d'entête.

    Citation Envoyé par matser Voir le message
    Ehonn: quand tu dis v.size(), je dois utiliser options.size()?
    Oui, ça retourne la taille du vector (le nombre d'éléments) (il faut imaginer que v est une variable de type std::vector<T>)

    Citation Envoyé par matser Voir le message
    maintenant, le compilateur me parle de classe anonyme ne pouvant pas supporter les méthodes et ne reconais plus le tableau "options"
    C'est une erreur bête du préprocesseur.
    Lorsque tu protèges ton fichier d'entête, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef menu
    #define menu
    Et lorsqu'il voit class menu {, il remplaces menu.
    Tu peux donc écrire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef MENU_HPP
    #define MENU_HPP

  8. #8
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par matser Voir le message
    je croyais que l'extension ".h" était du C
    En fait, tu peux mettre ce que tu veux. L'extension est une convention (c'est spécifié dans aucun standard mais tout le monde fais comme ça), et comme toute convention, il faut vraiment bien comprendre le pourquoi du comment avant de la transgresser. Donc en c++, la convention est: .h ou .hpp pour les en-têtes, .cpp pour les sources (il y en a d'autres, mais ceux-là sont les principaux).

    Tu dois confondre avec les en-têtes de la bibliothèque standard (standard library, ou SL), qui, en C sont suffixés par ".h", et en c++ ne sont pas suffixés. Mais l'absence de suffixe ne concerne que les en-têtes de la SL.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    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 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Je ne savais pas qu'on pouvait omettre les parenthèses dans menu::menu:compteur(0){}
    Effectivement j'avais mal vu, non les parenthèses des arguments sont bien sur obligatoires.
    Mais il n'est nullement besoin de déplacer la déclaration dans le header pour autant.
    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.

  10. #10
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Effectivement j'avais mal vu, non les parenthèses des arguments sont bien sur obligatoires.
    Mais il n'est nullement besoin de déplacer la déclaration dans le header pour autant.
    Oui, bien sûr.
    Moi aussi j'avais mal regardé et n'avais pas compris que c'était une tentative d'écriture du constructeur (je pensais que c'était une tentative d'initialisation d'un supposé membre statique... j'avais pas vu les {}).
    Du coup, c'était plus simple de mettre le reste du constructeur dans le fichier d'entête.

    Citation Envoyé par matser Voir le message
    j'avais bien pensé au push_back, mais après avoir posté le message...
    Sinon, si on indique using namespace std, on est quand-même obligé d'écrire std::size_t au lieu de size_t?
    En effet, le std:: est ici superflu.

  11. #11
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    bien changé "menu" par "MENU_HPP'
    et aussi renomé le fichier d'entête (menu.hpp)
    j'ai effectivement oublié les parenthèses à la ligne 30

    j'ai corrigé le code source selon vos conseilss

    la compilation ne fait plus d'histoires

    Merci à tous, j'ai résolu le problème:

    menu.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
    #ifndef MENU_HPP
    #define MENU_HPP
     
    #include <string>
    #include <vector>
     
    class menu{
       private:
          std::vector<std::string> options;
     
       public:
          void ajouterOption(std::string chaineOption);
          void affiche() const;
          int demanderOption() const;
    };
    #endif
    menu.cpp
    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
    #include "menu.hpp"
     
    #include <iostream>
    #include <string>
    using namespace std;
     
     
     
     
    void menu::ajouterOption(string chaineOption){
       options.push_back(chaineOption);
    }
     
    void menu::affiche() const { //les menus commencent à 1. c'est pourquoi j'utilise options[i-1]
       for (size_t i = 1; i <= options.size(); ++i)
          cout << i << "-" << options[i-1] << endl;
    }
     
    int menu::demanderOption() const {
       int i;
       do{
          affiche();
          cout<<"Quel est votre choix? ";
          cin>>i;
          if(i<1)
             cout<<"Pas de valeur nulle ou négatie. Recommencer"<<endl;
          else if(i>options.size())
             cout<<"Choix hors limite"<<endl;
       }
       while(i<1||i>options.size());
       return i;
    }

  12. #12
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bien

    Je n'ai pas compris ton histoire de i - 1.
    Les indices vont de 0 à options.size() - 1 compris.
    Lorsque tu fais un parcours, tu vas de 1 à options.size() compris et fais un accès en [i - 1], c'est strictement identique à ma version de la boucle (qui fait un accès en [i]).

    Pour void affiche() const, tu peux aussi surcharger l'opérateur << pour std::ostream. Tu pourrais donc écrire std::cout << un_menu << std::endl;.

    Petite optimisation, dans la signature de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ajouterOption(std::string chaineOption);
    , tu pourrais passer chaineOption en référence sur membre constant pour éviter une copie et interdire une modification. La signature serait donc void ajouterOption(std::string const & chaineOption);..

  13. #13
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    Lorsque tu fais un parcours, tu vas de 1 à options.size() compris et fais un accès en [i - 1], c'est strictement identique à ma version de la boucle (qui fait un accès en [i]).
    c'est parce que la première option du menu, à l'affichage, doit correspondre à 1. En partant de 0: cout<< i+1<< " - " << options[i]
    tu pourrais passer chaineOption en référence sur membre constant pour éviter une copie et interdire une modification. La signature serait donc void ajouterOption(std::string const & chaineOption);.
    ok, je modifie la signature (et la definition)
    Pour void affiche() const, tu peux aussi surcharger l'opérateur << pour std::ostream. Tu pourrais donc écrire std::cout << un_menu << std::endl;.
    je n'ai pas compris pourquoi.
    sinon voici comment cette classe peut être utilisé:
    mainMenu.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <string>
    using namespace std;
    #include "menu.hpp"
     
    int main(){
       int resultatMenu;
       menu sudokuAccueil;
       sudokuAccueil.ajouterOption("premier choix");
       sudokuAccueil.ajouterOption("deuz");
       sudokuAccueil.ajouterOption("non");
       resultatMenu=sudokuAccueil.demanderOption();
       cout<<"vous avez choisi l'option "<<resultatMenu<<endl;
    }

  14. #14
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    Ah si, ça y est, j'ai compris pourquoi surcharger <<...

  15. #15
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Oui, c'est mieux cout<< i+1<< " - " << options[i]Car la boucle a une écriture plus conventionnelle.

    Pour les fflux (operateur << et >>)
    http://cpp.developpez.com/faq/cpp/?page=SL#SL_operateur_affichage
    Ç'est mieux que les méthodes affiche et demanderOption (et l'un n'empêche pas l'autre).

  16. #16
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    Merci à tous pour vos contributions. Voici ce que cela donne:
    menu.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
    #ifndef MENU_HPP
    #define MENU_HPP
     
    #include <string>
    #include <vector>
     
    class Menu{
       private:
          std::vector<std::string> m_options;
          int m_choixOption;
       public:
          friend std::ostream& operator <<(std::ostream& flux, const Menu& menu);
          friend std::istream& operator >>(std::istream& flux, Menu& menu);
          void m_ajouterOption(std::string const & chaineOption);
          int m_getOption();
    };
    #endif
    menu.cpp:
    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
    #include "menu.hpp"
     
    #include <iostream>
    #include <string>
    using namespace std;
     
     
    void Menu::m_ajouterOption(string const & chaineOption){
       m_options.push_back(chaineOption);
    }
     
    std::ostream &operator<<(std::ostream &flux,Menu const & menu){
       for (size_t i = 0; i <= menu.m_options.size()-1; i++)
          flux << i+1 << " - " << menu.m_options[i] << endl;
       return flux;
    }
     
    std::istream& operator >>(std::istream& flux, Menu& menu){
       int i,nombreOptions(menu.m_options.size());
       do{
          cout << "Quel est votre choix? ";
          flux >> i;
          if(i<1)
             cout << "Pas de valeur nulle ou négative. Recommencez" << endl;
          else if(i > nombreOptions)
             cout << "Choix hors limite" << endl;
       }
       while(i < 1 || i > nombreOptions);
       menu.m_choixOption=i;
       return flux;
    }
     
    int Menu::m_getOption(){
       return m_choixOption;
    }
    mainMenu.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <string>
    #include "menu.hpp"
    using namespace std;
     
    int main(){
       Menu sudokuAccueil;
       sudokuAccueil.m_ajouterOption("premier choix");
       sudokuAccueil.m_ajouterOption("deuz");
       sudokuAccueil.m_ajouterOption("non");
       cout<<sudokuAccueil;
       cin>>sudokuAccueil;
       cout<<"vous avez choisi l'option "<<sudokuAccueil.m_getOption()<<endl;
    }
    et voici un exemple d'éxécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? 0
    Pas de valeur nulle ou négative. Recommencez
    Quel est votre choix? 4
    Choix hors limite
    Quel est votre choix? -4
    Pas de valeur nulle ou négative. Recommencez
    Quel est votre choix? 2
    vous avez choisi l'option 2
    merci à tous d'avoir participé à cette discussion

  17. #17
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    j'ai un peu modifié oprator >> pour qu'il répète le menu en cas de mauvaise réponse :
    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
    std::istream& operator >>(std::istream& flux, Menu& menu){
       int i,nombreOptions(menu.m_options.size());
       do{
          cout << "Quel est votre choix? ";
          flux >> i;
          if(i<1){
             cout << "Pas de valeur nulle ou négative. Recommencez" << endl << menu <<endl;
          }
          else if(i > nombreOptions){
             cout << "Choix hors limite" << endl << menu << endl;
          }
       }
       while(i < 1 || i > nombreOptions);
       menu.m_choixOption=i;
       return flux;
    }
    un petit exemple:
    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
    matser@ordiport:~/experiences/menu$ g++ -o quatre *cpp
    matser@ordiport:~/experiences/menu$ ./quatre 
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? 0
    Pas de valeur nulle ou négative. Recommencez
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? -5
    Pas de valeur nulle ou négative. Recommencez
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? 6
    Choix hors limite
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? 2
    vous avez choisi l'option 2

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    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 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    je suis pas trop fan de cette surcharge. En plus de devoir stocker le résultat du menu dans la classe.
    Je préfèrerais nettement une implémentation prototypée unsigned int Menu::MakeChoice() const;Mais dans le principe, ça permet d'appréhender la surcharge d'opérateur, et en particulier l'utilisation des stream, ce qui reste intéressant.
    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.

  19. #19
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 394
    Billets dans le blog
    16
    Par défaut
    Merci Bousk,
    voici ce que cela donne avec tes conseils:
    menu.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
    #ifndef MENU_HPP
    #define MENU_HPP
     
    #include <string>
    #include <vector>
     
    class Menu{
       private:
          std::vector<std::string> m_options;
       public:
          friend std::ostream& operator <<(std::ostream& flux, const Menu& menu);
          int m_choixOption() const;
          void m_ajouterOption(std::string const & chaineOption);
    };
    #endif
    menu.cpp:
    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
    #include "menu.hpp"
     
    #include <iostream>
    #include <string>
    using namespace std;
     
     
    void Menu::m_ajouterOption(string const & chaineOption){
       m_options.push_back(chaineOption);
    }
     
    ostream &operator<<(ostream &flux,Menu const & menu){
       for (size_t i = 0; i <= menu.m_options.size()-1; i++){
          flux << i+1 << " - " << menu.m_options[i];
          if(i<menu.m_options.size()-1)
             flux<<endl;
       }
       return flux;
    }
     
    int Menu::m_choixOption() const{
       int i,nombreOptions(m_options.size());
       do{
          cout << "Quel est votre choix? ";
          cin >> i;
          if(i<1){
             cout << endl << "Pas de valeur nulle ou négative. Recommencez" << endl << *this <<endl;
          }
          else if(i > nombreOptions){
             cout << endl << "Choix hors limite. Recommencez" << endl << *this << endl;
          }
       }
       while(i < 1 || i > nombreOptions);
       return i;
    }
    un petit exemple:
    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
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? 0
     
    Pas de valeur nulle ou négative. Recommencez
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? -2
     
    Pas de valeur nulle ou négative. Recommencez
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? 5
     
    Choix hors limite. Recommencez
    1 - premier choix
    2 - deuz
    3 - non
    Quel est votre choix? 3
    vous avez choisi l'option 3

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

Discussions similaires

  1. vector<map<string, string> >::iterator ?
    Par scheme dans le forum C++
    Réponses: 11
    Dernier message: 10/12/2010, 09h32
  2. Réponses: 2
    Dernier message: 18/09/2010, 22h33
  3. Problème std::vector <std::string >
    Par TNT89 dans le forum SL & STL
    Réponses: 9
    Dernier message: 31/05/2008, 17h51
  4. conversion vector to string
    Par identifiant_bidon dans le forum C++
    Réponses: 18
    Dernier message: 15/11/2007, 10h40
  5. [jsp] Comment faire un cast de Vector to String?
    Par adil_vpb dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/03/2007, 11h29

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