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 :

retour d'un membre char


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut retour d'un membre char
    Bonjour,

    J'ai un membre déclaré comme suit :

    char Membre[10];

    Comment dois je déclarer une fonction retournant ce membre ?

    Merci à tous

  2. #2
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Pour ne pas pouvoir le modifier à l'extérieur de ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* getMembre() const;

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Merci et que dois je mettre après le return de getMembre() ?

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Membre évidemment ... Pffff

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Le problème que je rencontre après est que je dois utiliser la valeur retounée dans strcat et le compilateur me dit :

    cannot convert parameter 1 from 'const char *' to 'char *'

    dans l'instruction :

    strcat(APP.GetMembre(),cEnglishLanguageFileName)

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Normal, tu es entrain d'essayer de modifier (avec strcat()) un pointeur dont le contenu est constant.

    Une solution (peut être) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string buf = APP.GetMembre();
    buf += cEnglishLanguageFileName;
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par mulfycrowh Voir le message
    Le problème que je rencontre après est que je dois utiliser la valeur retounée dans strcat et le compilateur me dit :

    cannot convert parameter 1 from 'const char *' to 'char *'

    dans l'instruction :

    strcat(APP.GetMembre(),cEnglishLanguageFileName)
    Et c'est bien...

    Si tu permet à une fonction externe de modifier une variable membre de ta classe, tu violes un principe fondamentale de la POO : l'encapsulation.
    Bien sur, il suffirait que tu enlèves les const de la fonction GetMembre() pour résoude ton pb de compile et prier pour que cEnglishLanguageFileName ne dépasse jamais 10 caractères...

    Si tu me permets un conseil :
    1. Fais un membre de type std::string, qui est plus flexible qu'un buffer de char.
    2. Fais un SetMembre() qui met à jour, avec tout les contrôles nécessaire ta variable membre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void SetMembre(const std::string& val)
    {
        membre = val;
    }

  8. #8
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Hou la la ! Ca sent le core dump à plein nez ton histoire...
    Si tu écris ça
    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
    #include <string.h>
     
    class foo
        {
        private:
            char Membre[10];
        public:
            char* getMembre() { return( Membre ) ;}
        };
     
    int main ()
        {
        foo f ;
        strcat( f.getMembre(), cEnglishLanguageFileName ) ;
        //...
    Bien sûr ça va marcher, mais cette implémentation masque completement le fait que Membre ne fait que 10 caractères. Or le strcat n'a aucun moyen de vérifier que tu ne dépasses pas ces 10 caractères !
    Donc, tôt ou tard, ta cEnglishLanguageFileName fera + de 10 caractères et ce sera le core dump.
    Tu as la chance de travailler avec un langage qui est un pur bijoux, alors sers-t-en !
    Comme le dit ram-0000, utilise les std::string !
    Tu verras, c'est que du bonheur...
    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
    #include <string>
     
    class foo
        {
        private:
            std::string Membre ;
        public:
            std::string & getMembre() { return( Membre ) ;}
        };
     
    int main ()
        {
        foo f ;
        f.getMembre() += cEnglishLanguageFileName ;
        //...
    Ce code est encore très discutable, mais au moins il est fiable.
    Et puis tu arrêtes de d'emm... avec la bibliothèque string.h qui demande une certaine habitude...
    [EDIT] argl ! j'ai été coiffé au poteau par Grulim...

  9. #9
    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
    Par défaut
    Bonjour,
    J'aurais tendance à faire plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct A
    {
       typedef char type_membre[10];
     
       type_membre membre;
     
       type_membre const & get_membre_1();
    };
    Mais pour être franc, j'aurais carrément tendance à ne pas utiliser char[10] ni en membre ni en retour de fonction :
    -> std::string s'il s'agit de modéliser une chaîne de caractère
    -> std::vector<char> s'il s'agit d'un vecteur dynamique
    -> boost::array<char,10> ou std::tr1::array<char,10> s'il s'agit d'un vecteur de taille déterminée à la compilation.

    Et in fine, utiliser le type unsigned char et non char s'il s'agit de manipuler des octets.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/07/2013, 14h36
  2. Retour d'une fonction simple *char
    Par FDR2006 dans le forum Débuter
    Réponses: 5
    Dernier message: 08/09/2010, 16h57
  3. Réponses: 10
    Dernier message: 13/04/2009, 13h02
  4. Retour de variable locale ou membre ?
    Par jph_void dans le forum C++
    Réponses: 5
    Dernier message: 25/08/2007, 21h30

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