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 :

Classe avec pointeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 91
    Par défaut Classe avec pointeurs
    Bonjour, je voudrais créé une classe appelé citation qui contient 2 champs sonAuteur et sonContenu. Ces deux variables étant des pointeurs.
    Elle contient également un constructeur et une méthode presenteToi().
    + un programme de test (main). Enfait, c'est un projet contenant un fichier le main, la définition & l'implémentation de la classe.

    J'ai commencé par créé le fichier 'citation.h' qui contient la définition de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Citation
    {
    private:
    char *auteur, *contenu;
    public:
    Citation(char *tel_auteur, char *tel_contenu);
    void presenteToi();
    ~Citation();
    };
    Pour l'implémentation de la classe: Citation.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
    #include "Citation.h"
    #include <iostream>
     
    using namespace std;
     
    Citation::Citation(char *tel_auteur, char *tel_contenu)
    {
    tel_auteur = new auteur;
    tel_contenu = new contenu;
    }
     
    void Citation::presenteToi()
    {
    cout << "L'auteur de la citation est:"<< tel_auteur << "Son contenu est:" << tel_contenu<< endl;
    }
     
    Citation :: ~Citation()
    {
             Delete tel_auteur;
             Delete tel_contenu;
    };
    Pour le main :

    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 <cstdlib>
    #include <iostream>
    #include "Citation.h"
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    char *aut,*cont;    
     
    cout<<"Entrez l'auteur:"<<endl;
    cin>> *aut;
     
    cout<<"Entrez le contenu:"<<endl;
    cin>> *cont;
     
    Citation c1(*aut, *cont);
    c1.presenteToi();
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Il y'a surement une erreur quelque part ..
    J'ai pas su comment faire pour corriger !

    Mercii d'avance pr votre aide ..

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut,

    La bonne question est "pourquoi s'embêter avec des pointeurs, là où il y a moyen de faire beaucoup plus simple "

    En effet, la gestion des pointeurs est une plaie que l'on préfère éviter autant que faire se peut...

    Surtout lorsque leur utilisation est destinée à... manipuler des chaines de caractères.

    La preuve en est que ton constructeur ne fait pas du tout ce que tu semble espérer qu'il fasse, et ne compile même pas:

    Tel que tu le présente, tu voudrais que le constructeur alloue de la mémoire et... fasse en sorte que l'argument passé pointe vers cette mémoire allouée...

    Ne serait-ce pas plutot le contraire qu'il faut faire (faire en sorte que le membre auteur prenne le contenu de l'argument, pareil pour contenu)

    De plus, la gestion des chaines de caractères "C style" implique... de les manipuler à la manière C...

    Ainsi, ton constructeur devrait être proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Citation::Citation(char *tel_auteur, char *tel_contenu)
    {
        auteur = new char[strlen(tel_auteur)];
        strcpy(auteur,tel_auteur);
        contenu = new char[strlen(tel_contenu)];
        strcpy(contenu,tel_contenu);
    }
    De même, il faut savoir qu'il existe deux formes pour new et deux formes pour delete, chaque forme de new devant être utilisée avec la forme de delete correspondante:
    • un pointeur alloué dynamiquement par new (sans crochets) doit libéré par delete
    • un pointeur alloué dynamiquement par new [] doit être libéré par delete[]
    • la libération d'un objet alloué dynamiquement par new à l'aide de delete[] ou vice versa (new[] et delete (sans crochets) a un comportement indéfini... Es-tu près à provoquer la troisième guerre mondiale
    Et je ne te parle pas ici des problèmes que tu pourrais rencontrer si, d'aventure, tu souhaitais comparer les différentes chaines de caractères

    Bref, tu l'auras compris, si j'insiste à ce point sur les désagréments dus à l'utilisation des pointeurs, c'est parce qu'il y a moyen de faire de manière bien plus simple et sécurisante.

    En effet, le standard C++ fournit la classe string, disponible dans l'espace de noms std par simple inclusion du fichier d'en-tête <string>, qui fournit tous les services que l'on peut attendre d'une chaine de caractères, dont
    • la gestion automatique de la mémoire nécessaire à la représentation des caractères qui la compose,
    • un constructeur par copie,
    • un constructeur trivial (ne prenant aucun argument)
    • une série de constructeur prenant différents arguments,
    • les opérateurs de comparaison < et ==
    • une série de fonctions membres qui peuvent s'avérer des plus utiles
    • ...

    Dés lors, pourquoi ne pas utiliser cette classe comme... membre de celle que tu souhaite créer (et l'utiliser également, cela va de soi, dans la fonction main)
    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

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ainsi, ton constructeur devrait être proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Citation::Citation(char *tel_auteur, char *tel_contenu)
    {
        auteur = new char[strlen(tel_auteur)];
        strcpy(auteur,tel_auteur);
        contenu = new char[strlen(tel_contenu)];
        strcpy(contenu,tel_contenu);
    }
    Au passage, tu as une petite erreur ici, tu as oublié la place pour le \0 final dans l'allocation.

    Encore une bonne raison d'utiliser les string C++ plutôt que les chaînes de caractères C.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Citation Envoyé par gl Voir le message
    Au passage, tu as une petite erreur ici, tu as oublié la place pour le \0 final dans l'allocation.

    Encore une bonne raison d'utiliser les string C++ plutôt que les chaînes de caractères C.
    La preuve par l'absurde
    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
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Par défaut
    J'ai peur que quand on en est au niveau de zouzou il vaut mieux apprendre Java ou VB.net que C++.
    quel est le besoin ici à part se compliquer la vie ?

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Citation Envoyé par Lightness1024 Voir le message
    J'ai peur que quand on en est au niveau de zouzou il vaut mieux apprendre Java ou VB.net que C++.
    quel est le besoin ici à part se compliquer la vie ?
    Tout le monde commence par apprendre un jour ou l'autre, il ne sert donc à rien d'être désobligeant avec zouzou...

    De plus, l'apprentissage du C++ permet de passer plus facilement "de l'autre coté du miroir" et de comprendre plus facilement ce que font java ou VB.

    Enfin, même si, effectivement, C++ est plus complexe que java ou que VB, il n'en demeure pas moins que l'habitude qui consiste à utiliser autant que faire se peut l'existant est bonne à prendre quel que soit le langage envisagé

    Sans vouloir entrer dans un énième débat C++ Vs les autres (un certain nombre de discussions en traitent déjà ) il faut aussi avouer que C++ a certains avantages (et certains inconvéniants) par rapport aux autres langages
    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

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

Discussions similaires

  1. Question map avec pointeur sur class.
    Par shirohige dans le forum C++
    Réponses: 7
    Dernier message: 22/11/2013, 09h45
  2. Pb avec classes et pointeurs
    Par Fahmi06 dans le forum C++
    Réponses: 3
    Dernier message: 19/02/2008, 17h39
  3. [POO] Classe avec pointeurs de classes
    Par dridri dans le forum Langage
    Réponses: 3
    Dernier message: 15/02/2008, 17h53
  4. Problèmes avec classes et pointeurs
    Par Anas1984 dans le forum C++
    Réponses: 2
    Dernier message: 02/11/2006, 12h49
  5. Objets/Classes avec un SGBD
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 09/11/2003, 16h04

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