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 :

[Debutant] Initialisation d'une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut [Debutant] Initialisation d'une classe
    Bonjour,

    je m'exerce en C++. Je développe une classe Client, qui représente un Client.
    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
     
    class CClient {
        public:
             CClient(int id);
             virtual ~CClient();
     
        private:
             int m_id;
     
        public:
             void setId(int id) {m_id=id;}
             int getId() {return m_id;}
    [..]
    }
    [..]
    CClient::CClient(int id){
         setId(id);
    }
    [..]
    int main(int argc, char *argv[])
    {
         CClient client(4);
         cout<<endl<<client.getId()<<endl;
    }
    [..]
    En sortie, j'obtiens une valeur à la con. -858993460 au lieu d'obtenir la valeur 4.
    Est-ce que d'après vous je fait une erreur qui vous semble flagrante ?

    Merci
    Ciao

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut
    J'ai trouvé mon erreur.
    En fait dans le code laissé, il manque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class CClient {
        public:
             CClient();
             CClient(int id);
             virtual ~CClient(); 
    [..]
    CClient::Client(){
        CClient(0);
    }
    Apparemment, on ne peut pas appeler un constructeur depuis un autre constructeur contrairement à Java. Je n'avais pas eu d'erreur. Je m'étais dit que ça allait. Je vais retourner à mon livre de C++.

    ++

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Tu peux poster quelque chose qui reproduit le problème?

    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
    $ cat etienne.cpp
    #include <iostream>
     
    class CClient {
    public:
      CClient(int id);
      virtual ~CClient() {}
     
    private:
      int m_id;
     
    public:
      void setId(int id) {m_id=id;}
      int getId() {return m_id;}
    };
     
    CClient::CClient(int id) {
      setId(id);
    }
     
    int main(int argc, char *argv[])
    {
         CClient client(4);
         std::cout << std::endl << client.getId() << std::endl;
    }
    $ como -o etienne etienne.cpp
    Comeau C/C++ 4.3.3 (Oct 24 2003 16:00:23) for RedHat_LINUX_INTEL_ELF
    Copyright 1988-2003 Comeau Computing.  All rights reserved.
    MODE:strict errors C++
     
    [~/src]$ ./etienne
     
    4
    Commentaires gratuits et non solicités:
    • j'aime pas using namespace;
    • l'idée d'un setter sur un id de client me semble bizarre; a priori CClient devrait être une classe avec sémantique de référence et l'id initialisé dans le constructeur et jamais modifié après
    • l'initialisation de membres se fait plutôt:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      CClient::CClient(int id)
         : m_id(id)
      {
      }

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut
    Donc pour initialiser mes variables je dois utiliser une liste d'initialisation comme ce que tu as spécifié ?
    Pour l'id, vous avez raison, ce n'est pas très logique.
    Et supposons que j'ai les constructeurs suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class CClient {
    public:
          CClient(LPCWSTR name,LPCWSTR ville,LPCWSTR adresse);
     
    private:
        LPCWSTR m_name;
        LPCWSTR m_adresse;
        LPCWSTR m_ville;
    [..]
    }
     
    CClient::Client(LPCWSTR name,LPCWSTR ville,LPCWSTR adresse=L""):m_name(name),m_ville(ville),m_adresse(adresse){
    }
    Et si je souhaite instancier un client sans spécifier le paramètre adresse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CClient client(L"Microsoft France",L"Paris");
    C bien ça ?

    Citation Envoyé par Jean-Marc.Bourguet
    Tu peux poster quelque chose qui reproduit le problème?
    En fait, je dois mettre mon code entier ?

    Citation Envoyé par Jean-Marc.Bourguet
    a priori CClient devrait être une classe avec sémantique de référence
    Que signifie sémantique de référence ?

    En fait, oui j'aimerais développer une classe client, j'ai fait ceci, qu'en pensez-vous ?
    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
     
    class CClient {
    public:
         CClient(long id,LPCWSTR name,LPCWSTR adresse,LPCWSTR ville);
         virtual ~CClient();
     
         long getId(){return m_id;}
     
         LPCWSTR getName(){return m_name};     
         void setName(LPCWSTR name){m_name=name};
     
         LPCWSTR getAdresse(){return m_adresse};
         void setAdresse(LPCWSTR adresse){m_adresse=adresse};
     
         LPCWSTR getVille(){return m_ville};
         void setVille(LPCWSTR ville){m_ville=ville};
     
    private:
         long m_id;
         LPCWSTR m_name;
         LPCWSTR m_adresse;
         LPCWSTR m_ville;
    }
    Et j'aimerais aussi faire une classe fournisseur. Pensez-vous que je devrais développer une classe plus générale dont les classes Client et Fournisseur hériteraient ?

    Qu'en pensez-vous ?
    Merci.
    ++

  5. #5
    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 etiennegaloup
    Citation Envoyé par Jean-Marc.Bourguet
    Tu peux poster quelque chose qui reproduit le problème?
    En fait, je dois mettre mon code entier ?
    Non. Couper le plus possible mais garder ce qui fait que le problème puisse être reproduit. C'est énervant d'avoir à faire des petites modifications pour que le code compile... surtout pour ne pas arriver au final à reproduire le problème.

    Citation Envoyé par Jean-Marc.Bourguet
    a priori CClient devrait être une classe avec sémantique de référence
    Que signifie sémantique de référence ?
    En gros, une classe où l'opérateur == est fondamentalement un test d'égalité des adresses, généralement sans assignation ni constructeur de copies.

    En fait, oui j'aimerais développer une classe client, j'ai fait ceci, qu'en pensez-vous ?
    Pouvoir changer le nom semble bizarre, mais ce peut être valide.

    Et j'aimerais aussi faire une classe fournisseur. Pensez-vous que je devrais développer une classe plus générale dont les classes Client et Fournisseur hériteraient ?
    La question est trop générale (de même que la précédante), on ne conçoit pas des classes dans l'absolu sans un contexte d'utilisation.

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Non. Couper le plus possible mais garder ce qui fait que le problème puisse être reproduit. C'est énervant d'avoir à faire des petites modifications pour que le code compile... surtout pour ne pas arriver au final à reproduire le problème.
    Ok, je ferais gaffe la prochaine fois.

    Citation Envoyé par Jean-Marc.Bourguet
    En gros, une classe où l'opérateur == est fondamentalement un test d'égalité des adresses, généralement sans assignation ni constructeur de copies.
    Bon, je n'ai pas tout compris, j'ai encore tellement de trucs à apprendre.
    • Sans assignation : sans méthode setter ?
      ni constructeur de copies. kezako ?


    Merci d'avance.
    ++

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/01/2008, 15h29
  2. [debutant]comemnt editer une class
    Par pierrot10 dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 23/06/2006, 12h14
  3. [UML][Debutant]Choisir entre une classe et une interface ?
    Par Laurent Dardenne dans le forum Diagrammes de Classes
    Réponses: 11
    Dernier message: 24/04/2006, 20h45
  4. [Debutant(e)]Compiler une classe
    Par tscoops dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 27/05/2004, 13h50
  5. [Debutant(e)]importer une classe
    Par ber_jp dans le forum Eclipse Java
    Réponses: 18
    Dernier message: 12/05/2004, 17h39

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