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 :

Vecteur de string


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Vecteur de string
    Bonjour

    J'ai un petit probleme;
    J'ai une fichier main.cpp qui appelle la classe Sal_info ( et Sal_info est une sous classe de Sal )
    Dans un prmier temps, j'avais
    " Sal_info(string nom,double prix,int place,string logiciel) "
    et dans ce cas tout marchait

    Maintenant au lieu de rentrer logiciel en string, je veux le rentrer en tant que vecteur de string et la ca me pose probleme. j'ai donc modifié seulement le main,le Sal_info.cpp et Sal_info.h

    voici mes codes

    main.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
     
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    #include "Sal_info.h"
     
    using namespace std;
     
    int main (){
     
    	string nom_salle="rfij";
    	int nbreplace=5;
    	double taxesalle=4;
     
    	vector<string> log;
    	log.push_back("contenu1");
    	log.push_back("contenu2");
     
    	Sal_info sal2(nom_salle,nbreplace,taxesalle, log);
    	cout<<endl<<endl<<sal2.get_logiciel()<<" logiciel  "<<endl;
     
    return 0;
    }
    Sal_info.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
     
    #include <iostream>
    #include <string>
    #include "Sal_info.h"
     
    using namespace std;
     
    Sal_info::Sal_info(string nom,double prix,int place,vector<string> logiciel):Sal(nom,prix,place){
    	this->logiciel = logiciel;
    }
     
    Sal_info::~Sal_info(void)
    {
    }
     
    string Sal_info::get_logiciel() {
    	return logiciel;
    }
    Sal_info.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
    17
    18
    19
    20
    21
    22
     
    #include <string>
    #include <fstream>
    #include <vector>
    #include "Sal.h"
     
    class Sal_info:
    	public Sal
    {
     
    private :
     
    	std::string logiciel;
     
    public:
     
    	Sal_info(std::string,double,int,std::vector<std::string>);
    	~Sal_info(void);
    	std::string get_logiciel();
    	void afficher();
     
    };
    Donc si quelqu'un pouvais me donner un petit coup de pouce

    Merci

  2. #2
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 477
    Points
    11 477
    Billets dans le blog
    11
    Par défaut
    Dans ta classe 'Sal_info', il faut déclarer 'logiciel' en tant que vecteur de string.
    Si c'était une classe à moi, j'aurais de plus passé mes paramètres par référence constante, afin d'éviter les copies intempestives et inutiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sal_info(const std::string &, double, int, const std::vector<std::string> &)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sal_info::Sal_info(const string & p_nom, double p_prix, int p_place, const vector<string> & p_logiciel)
    	:	Sal(p_nom,p_prix,p_place)
    {
    	logiciel = p_logiciel;
    }
    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).

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    J'aurais même tendance à passer une paire d'itérateur plutôt qu'un vecteur. A la volée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Sal_info:
    	public Sal
    {
     
    private :
     
    	std::vector<std::string> logiciel;
     
    public:
            template<class iterator_t_>
    	Sal_info(std::string const&,double,int,iterator_t_ begin_, iterator_t_ last_)
            :logiciel(begin_,last_)
           {}
    // etc...
    Autre chose : quel est l'intérêt de définir un destructeur vide ? Cf F.A.Q. Quand dois-je définir un destructeur ?

  4. #4
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Il ne faut pas oublier que l'accesseur doit retourner un vecteur et non plus un string.
    Enfin, un vecteur constant…
    http://cpp.developpez.com/faq/cpp/?p...SSE_accesseurs

    Citation Envoyé par 3DArchi Voir le message
    J'aurais même tendance à passer une paire d'itérateur plutôt qu'un vecteur.
    Je suppose que c'est pour permettre une instanciation à partir de n'importe quel type de conteneur ou de tableau.
    Mais il vaut maîtriser un minimum les template avant d'utiliser cette méthode, non ?

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Steph_ng8 Voir le message
    Il ne faut pas oublier que l'accesseur doit retourner un vecteur et non plus un string.
    Enfin, un vecteur constant…
    http://cpp.developpez.com/faq/cpp/?p...SSE_accesseurs
    Oui, mais non...

    En fait, Demeter nous conseille de n'exposer que ce qui est absolument nécessaire.

    Si tu renvoie carrément la collection de chaines de caractères, tu expose une structure entière, dont tu deviendra dépendant partout où tu l'utilisera, ce qui pourra poser problème le jour où, pour une raison ou une autre, tu souhaiterais changer ton vecteur en list ou en set pour des raisons d'efficacité.

    3DArchi donne ce qui pourrait être la meilleure méthode, à savoir utiliser une paire d'itérateur, l'un renvoyant le "premier" élément de la collection, et l'autre renvoyant "ce qui suit le dernier élément, de manière à pouvoir travailler sur le "range" semi ouvert [begin,end[.

    Si, en plus, tu imbrique dans ta classe un alias de type sur l'itérateur, et que tu conseille d'utiliser cet itérateur de préférence à tout autre, tu gagne énormément de souplesse et de modification de code lorsque tu prendra la décision dont j'ai parlé plus haut.

    En plus, tu remarquera assez facilement que cela se marie plutôt très bien avec les différents algorithmes fournis par le standard

    au final, ta classe sal_info pourrait ressembler à quelque chose comme
    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
    class sal_info : public sal
    {
        /* ce typedef n'est là que pour satisfaire ma flegme légendaire :D
         * mais il suffira de changer vector en n'importe quelle collection
         * compatible pour appliquer le changement, sans devoir modifier quoi
         * que ce soit d'autre ;)
         */
        typedef std::vector<std::string> log_collection;
        public:
            typedef typename log_collection::const_iterator log_const_iterator;
            log_const_iterator beginLogiciel() const{return log.begin();}
            log_const_iterator endLogiciel() const{return log.end();}
            /* on peut décider à tout moment d'ajouter le nom d'un logiciel */
            void addLogName(std::string const &  n){log.push_back(n);}
            /* ou de vérifier si la classe dispose d'un logiciel donné */
            bool logExists(std::string const & n)
            {
                struct cmp
                {
                    cmp(std::string const & n):n(n){}
                    std::string const & n;
                    bool operator()(std::string const & s2)
                    {
                        return n==s2;
                    }
                };
                return std::find_if(log.begin(),log.end(),cmp(n)) != log.end();
            }
        private:
            log_collection log;
    };
    Je suppose que c'est pour permettre une instanciation à partir de n'importe quel type de conteneur ou de tableau.
    Entre autres, mais c'est surtout parce qu'il est préférable de travailler sur des écarts plutôt que sur des collections complètes
    Mais il vaut maîtriser un minimum les template avant d'utiliser cette méthode, non ?
    PAs forcément, dans le sens où il "suffit" de savoir qu'on peut le faire, et savoir comment le faire, sans forcément comprendre le principe sous-jasent

    Bien sur, si on comprend ce qu'on fait, c'est encore mieux
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    OHLA OHLA OHLA....

    J'ai pas tout compris.... (et oui je debute)

    Alors a part la reponse de dragon joker j'ai rien compris (et pourtnt je reflechi)

    Ce qu'a proposé dragon joker m'interesse et j'ai essayé de le faire, mais ca ne marche toujours pas

    J'ai donc reduit mon code pour simplifier les choses

    main.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
     
    #include <iostream>
     
    #include <string>
    #include <fstream>
    #include <vector>
    #include "Sal_info.h"
     
     
     
    using namespace std;
     
     
    int main (){
     
    	vector<string> log;
    	log.push_back("contenu1");
    	log.push_back("contenu2");
    	log.push_back("contenu3");
     
     
     
    	Sal_info sal2(nom_salle,nbreplace,taxesalle, log);
    	cout<<sal2.get_logiciel()<<" logiciel  "<<endl;
     
    return 0;
    }
    Sal_info.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
    #include <iostream>
    #include <string>
     
    #include "Sal_info.h"
     
     
     
    using namespace std;
     
    Sal_info::Sal_info(const vector<string> & p_logiciel){
    	logiciel = p_logiciel;
    }
     
     
     
    Sal_info::~Sal_info(void)
     
    {
     
    }
     
    string Sal_info::get_logiciel() {
     
    	return logiciel;
     
    }
    Sal_info.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
    17
    18
    19
    20
    21
     
    #include <string>
    #include <fstream>
    #include <vector>
     
     
    class Sal_info
    {
     
    private :
     
    	std::<vector<std::string logiciel>>;
     
    public:
     
     
    	Sal_info(const std::vector<std::string> &);
    	~Sal_info(void);
    	std::string get_logiciel();
     
    };

    Merci

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Tu l'as un peu trop réduit car cela ne correspond à rien.

    Dans ton constructeur initialise le membre vecteur comme les autres : par la liste d'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sal_info::Sal_info(string const & nom,double prix,int place,vector<string> const & logiciel_):Sal(nom,prix,place),logiciel (logiciel_){

  8. #8
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    @koala01 Tout ce que je voulais dire, c'est que laisser l'accesseur retourner un string ne plaira pas au compilateur.
    Après, ce que tu dis est tout à fait juste, et je reconnais que je n'y avais pas du tout pensé…
    Mais c'est peut-être aller un peu loin quand on débute.
    (Oui, je sais… Il faut prendre des bons réflexes le plus tôt possible…)

    En passant, game44, on ne peut pas afficher un conteneur directement avec l'opérateur « << ».

    Citation Envoyé par koala01 Voir le message
    il est préférable de travailler sur des écarts plutôt que sur des collections complètes
    Ah ouais ?
    J'avais remarqué que la STL fonctionnait pas mal avec des paires d'itérateurs, mais je ne me suis jamais vraiment demandé pourquoi.
    C'est juste pour pouvoir travailler indépendemment avec n'importe quel type de conteneur, ou il y a d'autres raisons ?

  9. #9
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par game44 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	std::<vector<std::string logiciel>>;
    Euh… j'espère que tu t'es trompé en recopiant, parce que ça ne veut rien dire…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::string> logiciels;

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    J'avais remarqué que la STL fonctionnait pas mal avec des paires d'itérateurs, mais je ne me suis jamais vraiment demandé pourquoi.
    C'est juste pour pouvoir travailler indépendemment avec n'importe quel type de conteneur, ou il y a d'autres raisons ?
    Ce qui t'intéresse c'est de parcourir les éléments (itérateur) pas comment ils sont rangés (vecteur, list, map, etc.). Donc, oui cela permet de travailler indépendamment du conteneur parce que le concept attendu est celui d'itérateur (parcours d'éléments).

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    OUi, c'est ce que je veux, c'est juste recuperer les elements (peu importe l'ordre car c'est une liste

    Merci pour la remarque de steph, ca fait une erreur de compilation en moins, Mais il en reste encore beaucoup

  12. #12
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Ok, je vois.

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par game44 Voir le message
    Merci pour la remarque de steph, ca fait une erreur de compilation en moins, Mais il en reste encore beaucoup
    Euhh. J'avais réellement pensé qu'il s'agissait d'une erreur de copier/coller.
    Normalement, avec un code comme celui que tu as proposé, les erreurs sont assez explicites et triviales à corriger pour peu que tu révises tes cours de C++ . Si vraiment tu bloques sur certaines, alors n'hésites pas à nous les proposer ici. Mais pour les plus simples, fais quand même l'effort de chercher

Discussions similaires

  1. Melanger un vecteur de strings
    Par Muetdhiver dans le forum C++
    Réponses: 2
    Dernier message: 28/09/2008, 19h46
  2. conversion de vecteur de string en entier?
    Par toutounesan dans le forum C++
    Réponses: 31
    Dernier message: 26/09/2007, 14h04
  3. Création d'un tableau de Vecteur de String
    Par Claythest dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 29/11/2006, 17h43
  4. [.Net] Return d'un vecteur de String*
    Par Colbix dans le forum VC++ .NET
    Réponses: 8
    Dernier message: 25/06/2006, 18h57
  5. [Débutant]vecteur de string
    Par Tonta dans le forum C++
    Réponses: 3
    Dernier message: 25/05/2006, 14h00

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