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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    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 : 396
    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 290
    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 290
    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 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

  6. #6
    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.

  7. #7
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    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 : 396
    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;
    }

  8. #8
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    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 : 396
    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

  9. #9
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    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 : 396
    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?

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    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 290
    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.

+ 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