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 :

CPP class et char


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Par défaut CPP class et char
    bonjour,

    alors j'ai un trou et je n'arrive pas a comprendre ce qui se passe, je m'explique

    je fais une classe toute bête

    Dans le .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
     
    class Toto
    {
     
        public:
     
        Toto(); 
        void choixTitre(const char *titre);
        ~Toto();
     
     
        private:
     
        char V_titre[30];
    };

    Le but est de recuperer le cons char *titre et de le mettre dans l'attribut char V_titre.
    Etant donnée que l'on ne peut pas faire une simple assignation je fait donc de la facon suivante :

    dans le .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //je zap l'initialisation
     
    void Toto::choixTitre(const char *titre)
    {
        int i = 0;
        while(*titre){
            V_titre[i] = *titre;
            titre++; i++;
        }
    }
    Ce code plante et je ne comprend pas pourquoi, mais quand je fais ceci, ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //je zap l'initialisation
     
    void Toto::choixTitre(const char *titre)
    {
        char toto[30] = {0};
     
        int i = 0;
        while(*titre){
            toto[i] = *titre;
            titre++; i++;
        }
    }
    je trouve ce code identique, la seule difference est que ici, le char est declaré directement dans la methode et non dans la classe.


    J'ai l'impression qu'un truc simple m'echappe! mais pourquoi donc ne puis je pas recuperer const char *titre dans le char V_titre ???

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Soit tu as oublié de copier-coller la ligne int i = 0; dans ta première implémentation, soit il y a quelque part une autre variable i parasite...
    Et dans tous les cas tu oublies de copier le '\0' terminal dans ta boucle.

    Sinon en vrac :
    . il ne faut pas utiliser de chaînes C en C++ mais plutôt des std::string
    . tu mets les données en visibilité protected ce qui semble indiquer que ta classe est prévue pour être dérivée mais ton destructeur n'est pas virtuel
    . en général on utilise plutôt ++i que i++ par défaut

    MAT.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Par défaut
    oui effectivement dans l'exemple j'ai oublié de copier le int i = 0;

    pour le '\0' n'est il pas copié en même temps a la fin de la boucle ? (il me semblais)

    pour le ++i, je ne savais pas trop a quel moment il etait utile de l'utiliser ne connaissant pas bien les differences...

    heu oui je me suis planté avec le "protected", cette classe n'est pas faite pour faire de l'heritage, donc c'est "private" qu'il faut mettre.

    Pour le char c'est parce que j'utilise la library sdl qui a besoin d'un char pour certaines données

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par hakurou Voir le message
    pour le '\0' n'est il pas copié en même temps a la fin de la boucle ?
    Et bien non puisque la boucle s'arrête dès que *titre vaut justement 0.

    MAT.

  5. #5
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Pour le char c'est parce que j'utilise la library sdl qui a besoin d'un char pour certaines données
    avec un std::string ça va aussi très bien, il y a la fonction membre de string c_str() pour ça.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Par défaut
    J'ai changé pour du choixTitre(const string titre); et appliqué la methode c_str() et ca marche ! l'attribut en char recupere bien les données du string.

    merci beaucoup !

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par hakurou Voir le message
    J'ai changé pour du choixTitre(const string titre);
    Il ne reste plus qu'à passer par référence à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    choixTitre(const string& titre);
    Et c'est parfait.

    MAT.

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

Discussions similaires

  1. VC++: impossible répartir classe entre .h et .cpp
    Par huguesacker dans le forum C++/CLI
    Réponses: 2
    Dernier message: 13/11/2006, 02h46
  2. Classe clavier problème avec char
    Par benjiprog dans le forum Langage
    Réponses: 30
    Dernier message: 30/06/2006, 16h04
  3. classe iostream sous dev-cpp
    Par yashiro dans le forum Dev-C++
    Réponses: 3
    Dernier message: 18/04/2006, 17h34
  4. Distribuer des classes sans le .cpp
    Par Patrick Seuret dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/04/2006, 09h22
  5. SDL et classe cpp
    Par Tommy Jean dans le forum SDL
    Réponses: 8
    Dernier message: 19/08/2005, 08h08

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