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

Langage C++ Discussion :

Etendre une classe


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut Etendre une classe
    Bonjour,

    En utilisant la STL, et plus précisément vector (mais ca pourrait etre une classe quelconque), j'aimerais rajouter une méthode dump(), qui consiste a simplement afficher tous les elements du vecteurs.

    Pour ca, je peux faire une classe myVector qui dérive de vector et lui rajouter la méthode dump, mais ca veut dire qui si jveux enlever cette méthode dump une fois que j'ai fini mon débuggage, j'utilise myVector pour rien partout.

    Je pensais mettre des ifdef DEBUG, endif tout autour de chaque v.dump(), mais il reste le probleme de la declaration du myVector v qu'il faudrait aussi entourer du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEBUG
    myVector v;
    #else
    vector<int> v;
    #endif
    Aussi jme demandais si yavait pas moyen de faire un peu comme en js avec un prototypage ou on ajoute une méthode à la "volée" qui ici serait faite une fois pour toute (ou pas) avant la compilation?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pourquoi vouloir absolument que dump() soit membre de la classe ? Il est bien plus simple et clair de définir une fonction non-membre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef DEBUG
        template <typename T>
        void dump(const std::vector<T>& v) {...}
    #else
        template <typename T>
        void dump(const std::vector<T>& v) {/* vide */}
    #endif

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je sais pas trop pourquoi jvoulais qu'elle appartienne à la classe vector...je me suis pas posé la question en fait, ca a fait tilt direct...

    Donc du coup on peut la mettre en dehors et tout va tres bien .

    Par contre, simple question (enfin...), dans ton exemple, notamment ce passage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #else
        template <typename T>
        void dump(const std::vector<T>& v) {/* vide */}
    #endif
    tu sembles sous entendre que je n'ai pas besoin d'entourer mes divers dump par des conditionnelles étant donné que dump aura quand même un corps de fonction ( vide ). Au niveau du compilateur (mon ptit gcc), peut on espérer qu'il ne cree pas un contexte pour la fonction et qu'il passe directement à la suite des instructions dans la mesure ou il a détecté un corps vide?
    ( c'est juste pour la culture ).

    En tout cas merci, j'avais pas du tout pensé à mettre la fonction en dehors...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Au niveau du compilateur (mon ptit gcc), peut on espérer qu'il ne cree pas un contexte pour la fonction et qu'il passe directement à la suite des instructions dans la mesure ou il a détecté un corps vide?
    Avec les optimisations activées, oui, l'appel sera complètement éliminé.

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

    Informations professionnelles :
    Activité : aucun

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

    L'avantage des fonctions template, c'est qu'elles sont de facto inlinées, parce que le compilateur doit attendre de savoir quel est le type réellement utilisé pour créer le code binaire exécutable correspondant.

    De ce fait, un appel à la fonction vide va se résumer à... une "no-op", ce qui ne fera donc pas vraiment perdre de temps à l'exécution

    Si, même, tu décidais d'utiliser une fonction non template, mais selon le même modèle (une version "debug" faisant quelque chose et un version "non debug" ne faisant rien), tu n'aurais, au pire, que les opérations de "push" et de "pop" du contexte qui seraient effectuées dans la version "non debug", avec, entre les deux, une nouvelle no-op.

    Mais, même dans ce cas, il faudrait déjà invoquer dump à de nombreuses reprises pour constater une baisse significative des performances

    Ceci dit, tu peux arriver à éviter également ces quelques opérations inutiles en travaillant sur base d'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifdef DEBUG
        template <typename T>
        void dump(const std::vector<T>& v) {...}
    /* je ne suis plus tout à fait sur de la syntaxe ici... */
    #define Debug_dump(X) dump(x);
    #else
    #define Debug_dump(X)
    #endif
    et en invoquant Debug_dump dans ton code

    De cette manière, Debug_dump(un std::vector) ne sera remplacé par l'appel de dump(...) que si DEBUG est défini, et sera remplacé par... une ligne vide (et donc strictement rien au niveau du code exécutable) si DEBUG n'est pas défini
    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

  6. #6
    Invité
    Invité(e)
    Par défaut
    impeccable!
    Je saisis enfin l'utilité (une des) des macros

    Merci à vous deux

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

Discussions similaires

  1. Etendre une classe avec HttpServlet impossible
    Par SpeedOverflow dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 22/11/2011, 09h59
  2. Etendre une classe
    Par xian21 dans le forum C#
    Réponses: 2
    Dernier message: 11/11/2008, 12h50
  3. Etendre une class QT
    Par guiyomh dans le forum Débuter
    Réponses: 6
    Dernier message: 24/06/2008, 14h23
  4. Etendre une classe qui appartient a un package
    Par agent007se dans le forum Langage
    Réponses: 5
    Dernier message: 09/03/2007, 15h25
  5. [heritage] etendre une classe interne en dehors du package
    Par ChristopheH dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2004, 14h15

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