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 :

Probleme avec la surdefinition des constructructeurs


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Par défaut Probleme avec la surdefinition des constructructeurs
    Bonjour;
    Je viens de me remtre au C/C++ apres une longue periodes de Java et Objective-C donc mes questions peuvent parraitre un peut stupide lol

    Je veux creer une classe qui surdefinie la pluspart des constructeurs (j'ai recreer le pb avec le grand classic de la classe point):

    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
     
    class Point {
     
    private:
        int x;
        int y;
        static int numberOfPoints;
     
    public:
        //Constructors
        Point();
        Point(int coordX,int coordY);
    ...
    }
     
    ================
    Point::Point(){
        cout << "Point::Point()" << endl;
        this->x = 0;
        this->y = 0; 
        numberOfPoints++;
        cout << "Numbers of Point Increasing = " << numberOfPoints;
    }
     
    Point::Point(int coordX,int coordY){
        cout << "Point::Point(int coordX,int coordY)" << endl;
        this->x = coordX;
        this->y = coordY;
    }
    ...
    tout fonctionne a merveille sauf pour l'incrementation de NumberOfPoints.
    ce que je veux faire c'est redefinir tout les constructeurs pour que quelquesoit la maniere dont le point est creer, la varaible soit incrementer.

    je pensais que en surdefinissant le constructeur par default sa ferais l'affaire mais aparament non.

    est ce qu'il existe une maniere de faire sa sans avoir a rajouter dans chaque constructeur Initialize();

    Merci d'avance pour votre aide

    Jason

  2. #2
    screetch
    Invité(e)
    Par défaut
    salut
    au lieu d'avoir un entier, mets une classe contenant un entier

    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
     
    class Counter
    {
        static int numberOfPoints;
        Counter();
        ~Counter();
        // copie aussi!! mais la, j'ai la flemme
    };
    class Point {
     
    private:
        int x;
        int y;
        Counter c;
    public:
        //Constructors
        Point();
        Point(int coordX,int coordY);
    ...
    }
     
    ================
    Counter::Counter()
    {
        numberOfPoints++;
        cout << "Numbers of Point Increasing = " << numberOfPoints;
    }
    Counter::~Counter()
    {
        numberOfPoints--;
    }
    ================
    Point::Point(){
        cout << "Point::Point()" << endl;
        this->x = 0;
        this->y = 0; 
    }
     
    Point::Point(int coordX,int coordY){
        cout << "Point::Point(int coordX,int coordY)" << endl;
        this->x = coordX;
        this->y = coordY;
    }
    ...
    [edit] ca manque un peu de détails

    quel que soit le constructeur choisi, les membres de type "T" sont toujours initialisés avec leur constructeur par défaut ou grace a un constructeur explicite, et le destructeur est appelé automatiquement. Ici on ce sert d'une des forces du C++, le fait que le compilateur nous aide a générer beaucoup de code sans effort, par exemple en appelant automatiquement des constructeurs ou destructeurs.

    Ici, en encapsulant le compteur dans une classe, cela permet de s'assurer grace au compilateur que le constructeur et le destructeur seront toujours appelé, et surtout, c'est automatique, il n'y a pas de code supplémentaire a ajouter.

    c'est une garantie du compilateur, c'est une des meilleures garanties qui existent (ne jamais faire confiance a un programmeur, si on peut a la place demander au compilateur de le faire)
    Dernière modification par screetch ; 21/09/2009 à 15h12. Motif: manque de détails

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Par défaut
    Merci screetch,
    j'avais pas penser a cette solution;
    cependant cela ne repond pas au problem que j'avais pose
    ou est-ce que j'appel mon ++ ou le compteur (celon l'implementation) pour que j'ai le mm traitement quelquesoit la maniere de construire mon objet.

    je voudrais eviter d'avoir a mettre dans chaque constructeur un appel a une fonction (ou d'un compteur)

  4. #4
    screetch
    Invité(e)
    Par défaut
    regarde le code que j'ai posté, il fait deja ca tout seul. c'est magique.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Il est pas super thread-safe ton code "screetch"

    Mais, c'est une bonne base.

  6. #6
    screetch
    Invité(e)
    Par défaut
    le code original non plus... moi on me pose une question j'y réponds, je fais pas le ménage ni la vaisselle.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Pour répondre à ta question initiale anarkia, sache que le mécanisme de chaînage des constructeurs en C++ est différent de celui de JAVA.

    Il n'existe aucun moyen d'appeler un constructeur particulier dans le corps d'un constructeur (de la même classe s'entend). Donc l'idiome JAVA qui utilise un "this(...)" n'existe pas.

    Pour factoriser du code entre constructeur il faut en général passer par une fonction membre du style "init()" comme tu le décris.

    Pour ce qui est du comptage de référence, y'a quelques manières classique et éprouvée. Une recherche rapide te les donnera.

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Un autre façon de faire est d'hériter (de façon privée p.ex.) de la classe compteurs. Ce sont les deux seules façons EDIT:<efficaces> de factoriser du code commun dans les constructeurs en l'absence de leur chainage.[*]

    Et si vous voulez que cela soit thread-safe, utilisez un type de compteur atomique au lieu de int pour le compteur -- il y a tout ce qu'il faut dans boost, ACE, Qt, STLsoft, C++0x, TBB, etc.

    EDIT:[*] les fonctions init() ont des particularités qui ne me plaisent pas du tout :
    - détournent les débutants OO de l'utilisation des constructeurs
    - ne permettent pas de construire les attributs, elles ne peuvent que leur affecter une nouvelle valeur ou appeler des fonctions dessus ; on perd toute chance de constance.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Relis le titre du sujet. Je pense que venant de JAVA, cette précision est importante.

    Pour enseigner le C++ assez régulièrement, c'est une confusion entre les deux langages que je retrouve assez souvent.

  10. #10
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par Jan Rendek Voir le message
    Pour enseigner le C++ assez régulièrement, c'est une confusion entre les deux langages que je retrouve assez souvent.
    Quand le C++0x rentrera dans les moeurs, ça fera toujours une difficulté de moins à enseigner - on pourra chainer les constructeurs comme en Java

    Edit : ceci-dit je trouve la solution de Screetch meilleur qu'un appel à un constructeur commun (java) ou à une fonction init(). L'incrémentation du compteur est automatique quelle que soit la manière dont on construit le Point, et ça permet de se prémunir de l'erreur prévisible lors d'une maintenance future où quelqu'un aura besoin d'ajouter un nouveau constructeur et oubliera inévitablement d'appeller init().

  11. #11
    screetch
    Invité(e)
    Par défaut
    j'ai ajouté un peu de blabla sur mon post.

  12. #12
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Quand le C++0x rentrera dans les moeurs, ça fera toujours une difficulté de moins à enseigner - on pourra chainer les constructeurs comme en Java
    je trouve ca presque dommage, cela incitera les gens a ne pas utiliser cette solution présentée plus haut (ou l'heritage privé) et a ecrire du code un peu Java.
    Si des choses doivent etre faites en commun, les encapsuler est une bonne chose; j'ai peur qu'on se retrouve avec des objets a deux/trois/2000 fonctionnalités (qui sait compter combien d'objets sont créés, qui sait se cloner, qui sait envoyer des messages, qui sait faire des concours de biere, qui sait danser a la star ac...)
    et on va se retrouver avec plein de code a la "Qt" (extension de classes publiques, des classes qui savent faire 20000 choses)

  13. #13
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Par défaut
    Mon erreur screetch,
    J'avais pas fait attention que en creant compteur() sa allait incrementait comme un grand :$

    Merci au autre en compilant toute vos reponses j'ai ma reponse ^^

    (j'ai ecrit un bout de code pour illustrer mon probleme, il etait pas la pour etre jolie, ni thread safe ^^)

  14. #14
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il y a juste un léger inconvénient à cette approche, c'est si on veut ajouter un tel compteur à plusieurs classes, mais que le compteur compte chaque classe indépendamment. Pour résoudre ça, généralement, je templatise le type du compteur avec la classe qu'il doit compter, afin d'avoir bien un type différent (et donc une variable statique différente) par classe à compter.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Probleme avec la barre des tâches !!
    Par SAMI B dans le forum Windows XP
    Réponses: 4
    Dernier message: 28/04/2006, 16h19
  2. [Javascript/Dhtml] Problemes avec la supression des formulai
    Par ETI-trian dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/03/2006, 20h49
  3. [Configuration] probleme avec le remplacement des accents
    Par xtaze dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 17/12/2005, 19h16
  4. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  5. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51

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