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 :

[Débutant] Les Classes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Par défaut [Débutant] Les Classes
    Bonjour,

    Petit problème avec le listing suivant (qui sert à rien... juste à apprendre:)

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    // Déclaration de constructeur et de
    // destructeurs pour la classe Chat
    // Le programmeur crée un constructeur par défaut
     
    #include <iostream>                 // pour cout
     
    class Chat                          // début déclaration de la classe
    {
        public:                         // début de section publique
            Chat (int initialAge);      // constructeur
            ~Chat();                    // destructeur
            int LireAge();              // fonction d'accèes
            void DefAge(int age);       // fonction d'accèes
            void Miauler();
     
        private:                        // début de la section privée
            int wAge;                   // variable membre
    };
     
    Chat::Chat(int initialAge)          // constructeur de Chat
    {
        int wAge;
    }
     
    Chat::~Chat()                       // destructeur, ne réalise aucune action
    {
    }
     
    int Chat::LireAge()                 // LireAge, fonction d'accès publique
    {
        return wAge;                    // renvoie la valeur du membre wAge
    }
     
    void Chat::DefAge(int age)          // définition de DefAge, fonction d'accès publique
    {
        wAge = age;                     // affecte à la variable membre wAge
    }                                   //  la valeur par le paramètre age
     
    /*  définition de la méthode Miauler
        renvoie : void
        paramètre : Aucun
        rôle : imprime "Miaou" à l'écran  */
    void Chat::Miauler()
    {
        std::cout << "Miaou. \n";
    }
     
    // créer un objet chat, définir son âge, le faire miauler,
    // afficher son age, le faire miauler, de nouveau
     
    int main()
    {
        Chat Frisky(5);
        Frisky.Miauler();
        std::cout << "Frisky est un chat qui a ";
        std::cout << Frisky.LireAge() << " ans.\n";
        Frisky.Miauler();
        Frisky.DefAge(7);
        std::cout << "Maintenant Frisky a ";
        std::cout << Frisky.LireAge() << " ans.\n";
        return 0;
    }
    Le prog devrait m'afficher dans la console :

    Miaou.
    Frisky est un chat qui a 5 ans
    ...

    Hors, il m'affiche ceci :

    Miaou
    Frisky est un chat qui a 20092332115 ans
    ...

    J'ai peau retourner dans tout les sens, impossible de trouver l'erreur.
    J'utilise Code::Block

    Merci d'avance.

    PS: Sinon, pourquoi Code::Block me dit ce Warning:
    main.cpp:62:2: warning: no newline at end of file

  2. #2
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Dans ton programme, tu fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Chat Frisky(5);     // <== appel du constructeur
    ...
    Frisky.LireAge();   // <== lecture de l'age
    Or, si on regarde le code de ton constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Chat::Chat(int initialAge)          // constructeur de Chat
    {
        int wAge;
    }
    Ben.... il fait pas grand chose !!!

    Ca, ce serait deja mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Chat::Chat(int initialAge)          // constructeur de Chat
    {
        DefAge(initialAge);
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Par défaut
    Merci de la réponse.

    Ta solution fonctionne, mais j'ai préfèré écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Chat::Chat(int initialAge)          // constructeur de Chat
    {
        wAge = initialAge;
    }
    Sinon, si quelqu'un connaît la réponse pour le PS...

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Sagoth Voir le message
    Merci de la réponse.

    Ta solution fonctionne, mais j'ai préfèré écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Chat::Chat(int initialAge)          // constructeur de Chat
    {
        wAge = initialAge;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Chat::Chat(int initialAge)
       : vAge(initialAge)
    {}
    Sinon, si quelqu'un connaît la réponse pour le PS...
    Parce que gcc (le compilateur utilisé par CodeBloc) a été conçu sous Unix ou LF est un marqueur de fin de ligne et que la norme dit qu'un fichier source ne devrait pas avoir de lignes incomplète (donc sans marqueur de fin de ligne).

    D'après ce que j'ai compris, la situation sous Windows est moins claire:apparemment certains programmes considère la paire de caractère CR-LF comme un séparateur de ligne (donc il ne peut pas y avoir de lignes incomplète), d'autres comme un marqueur de fin (auquel cas la dernière ligne peut être incomplète).

    CodeBloc devrait générer des fichiers qui correspondent à ce que gcc attend.

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Je ne veux pas avoir l'air de chipoter, mais l'ecriture suivante est plutôt conseillée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Chat::Chat(int initialAge)          // constructeur de Chat
    {
        DefAge(initialAge);
    }
    Car ainsi, si demain tu decides que lors de l'appel à DefAge() l'âge est stocké en "année de chat" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Chat::DefAge(int age)
    {
        wAge = age * 7;      // 1 année humaine = 7 années de chat
    }
    Ton constructeur, lui, ne change pas.

    C'est surtout valable si tu dérive cette classe, car dans les classes dérivées, "DefAge" peut être redefinie.

    Par exemple, tu crée une classe "Animal" et une classe "Chat" qui dérive de "Animal" :

    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 Animal
    {
        public:
            Animal (int initialAge);
            ~Animal();
            int LireAge();
            void DefAge(int age);
     
        private:
            int wAge;
    };
     
    class Chat : public Animal
    {
        public: 
            Chat (int initialAge);
            ~Chat();
            void Miauler();
    };

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Sauf que pour faire jouer le polymorphisme, DefAge devra être virtuel, or on ne peut pas appeler une fonction virtuelle depuis un constructeur.

    Bref le mieux pour les constructeur reste d'utiliser les listes d'initialisation, en cas d'héritage rien n'empêche d'appeler le setter (virtuel ou non) après le constructeur.

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

Discussions similaires

  1. Question de débutant sur les classes
    Par roxydu33 dans le forum C#
    Réponses: 5
    Dernier message: 12/05/2011, 14h04
  2. Question débutant sur les classes
    Par oranoutan dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/05/2007, 11h25
  3. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  4. [débutante]utiliser les classes css pour surligner des liens
    Par Mitaka dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 06/01/2006, 09h37
  5. Les classes amies en Delphi
    Par Bruno75 dans le forum Langage
    Réponses: 3
    Dernier message: 02/09/2003, 19h34

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