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 :

Aide pour la classe chaine


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Aide pour la classe chaine
    Bonjour !
    Je suis une formation en c++. En ce moment mon prof nous apprend à faire une classe Chaine et je suis perdu à un exercice qu'il nous demande de faire.
    Dans l'exercice qu'il nous demande de faire, il nous impose la forme du code pour la classe chaine de manière suivante:

    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 Chaine {
    private:
    char *caracteres; // Pointe vers la zone dynamique où sont stockés les caractères
    int nb; // Le nombre de caractères de la chaîne
    public :
    Chaine(); // Constructeur par défaut (une chaîne vide)
    Chaine(const Chaine &ch); // Constructeur de copie
    Chaine(const std::vector<char> &v);// Constructeur depuis les caractères de v
    Chaine(const char *ch); // Constructeur depuis un cstring
    template <typename Iter>
    Chaine(Iter deb, Iter fin); // Construct. depuis les car. d’un intervalle
    int longueur() const; // Longueur de la chaîne
    void concat(const Chaine &d); // Concatène d à la suite de l’objet courant
    void affiche(); // Affichage de la chaîne
    };
    Elle n'est pas complète et on doit la compléter par nous même. Là où je coince déjà c'est au niveau de ce constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chaine(const char *ch);
    De ce que j'ai compris c'est que j'ai besoin de ce constructeur pour pouvoir déclarer une chaine dans le int main(){}, mais avec les attributs qu'il m'impose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private:
    char *caracteres; // Pointe vers la zone dynamique où sont stockés les caractères
    int nb; // Le nombre de caractères de la chaîne
    Je ne vois pas du tout comment faire ...
    Est-ce que quelqu'un pourrait m'aider s'il vous plaît ? Je demande pas qu'on me fasse l'exercice mais juste qu'on éclaire ma lanterne ...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut
    Ben clairement tu vas pas pouvoir initialiser le membre caracteres avec l'argument du constructeur vu qu il est const...
    Du coup tu n'as pas d'autres choix que de prendre la taille du cstring ch, de l'utiliser pour allouer de la mémoire pour 'caracteres' via new puis de copier ton cstring dans 'caracteres'. D'ailleurs il vaut mieux que ce soit comme ca vu que tu ne sais pas trop ce que deviendra le pointeur ch plus tard.
    Par contre je trouve étrange que te forcant à mettre un new quelque part l'exo ne mentionne pas de destructeur... du coup je le rajouterais.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il va en effet falloir ajouter un destructeur (qui nettoie le buffer avec un delete[]), et qu'à chaque fois tu alloues toi-même le contenu de la chaîne avec new[] (puisque tel est probablement le but pédagogique de l'exercice).

    Un petit strlen pour déterminer la longueur, un petit +1 pour déterminer la vraie taille de buffer nécessaire, et un new[].

    PS: La fonction membre affiche() devrait être const.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    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,

    On peut changer un tout petit peu le code d'origine ou non???

    Car si oui, que dirais tu de
    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
    class Chaine {
    private:
    /* char *caracteres; // Pointe vers la zone dynamique où sont stockés les caractères
    int nb; // Le nombre de caractères de la chaîne */
    std::string str;
    public :
    Chaine(){}
    /* devenu inutile
    Chaine(const Chaine &ch); // Constructeur de copie
    */
    Chaine(const std::vector<char> &v):str(v.begin(),v.end()){}
    Chaine(const char *ch):str(ch){}
    template <typename Iter>
    Chaine(Iter deb, Iter fin);str(deb,fin){}
    int longueur() const{return str.size();}
    void concat(const Chaine &d){str+=d;}
    /* !!!! devrait être const !!!!*/
    void affiche(){std::cout<<str;}
    };
    Ah, mais j'y pense... Le but de l'exercice est peut être de te faire jouer avec l'allocation dynamique de la mémoire ??? Tu devrais alors dire à ton prof que c'est un très mauvais exemple (utile dans un cours de C, absolument aberrant dans un cours de C++)... S'il veut vous faire jouer avec l'allocation dynamique de la mémoire, il devrait attendre d'avoir abordé l'héritage, et, surtout, il devrait enchainer directement sur les pointeurs intelligents
    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

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Salut,

    Tout d'abord merci pour vos réponses! Non je ne peux pas vraiment modifier le code de cette manière ... Oui je me doute que c'est aberrant mais le but de l'exercice est uniquement pédagogique. Je dois compléter mais pas modifier le code proposé par l'exercice.

    Je pense que mon problème est en partie résolu, mais je ne sais pas si je suis dans le bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Chaine(const char *ch):nb(strlen(ch))
        {
            carac= new char [nb];
            for(unsigned i=0; ch[i]!='\0'; ++i)carac[i]=ch[i];
        }
    Si ma manière de faire est bonne comment afficher ma chaine en utilisant "carac" svp ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Puisque tu utilises strlen, autant utiliser strcpy pour copier le contenu. Par contre, ton new est mauvais, car il faut allouer strlen()+1 à cause du caractère nul terminal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [Batch] Aide pour supprimer une chaine de caractere
    Par colapsus dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 02/06/2011, 19h15
  2. Aide pour les class
    Par zidane5 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 22/04/2010, 12h29
  3. Aide pour transformer une chaine avec sed
    Par progfou dans le forum Linux
    Réponses: 9
    Dernier message: 14/10/2009, 09h32
  4. Demande d'aide pour faire une chaine de compilation en C
    Par wahid_kw1 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 02/03/2009, 22h48
  5. Exercice: Aide pour les classes
    Par benben10 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 17/07/2008, 15h36

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