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 :

Plus d'appel au destructeur qu'au constructeur ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 56
    Par défaut Plus d'appel au destructeur qu'au constructeur ?
    Le C++ c'est chaud...

    J'ai un petit programme que j'ai essayé de simplifier au maximum
    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
    using namespace std;
    #include <string>
    #include <vector>
    #include <stdio.h>
     
    class ebovar
    {
    public:
          union {
              int i;
              float f;
              bool b;
              string *s;
              void *o;
          };
     
    // var is null
    	ebovar() : i(0) {
    		printf("++ create NULL\n");
    	}
    	~ebovar()
    	{
    		printf("-- delete ebovar %d\n", i);
    	}
     
    // integer function
    	ebovar(int v) {
    		i = v;
    		printf("++ create int %d\n", i);
    	}
    	operator int() { return i; }
    };
     
    /********************************************************************
    **
    ** Operateur +
    **
    ********************************************************************/
     
    ebovar operator+(ebovar left_op, ebovar right_op)
    {
    	return (ebovar)((int)left_op + (int)right_op);
    }
     
    int main(int _argc, char **_argv)
    {
    	ebovar _a = 10;
    	ebovar _b = 12;
    	ebovar _result = _b + _a;
    }
    il affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ++ create int 10
    ++ create int 12
    ++ create int 22
    -- delete ebovar 12
    -- delete ebovar 10
    -- delete ebovar 22
    -- delete ebovar 12
    -- delete ebovar 10
    Comment puis-je avoir 3 appels au constructeur de ma classe et 5 appels au destructeur ?
    Qu'est ce que j'ai manqué ?

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    C'est à cause des copies des paramètres par l'opérateur + :
    Citation Envoyé par webshaker Voir le message
    ebovar operator+(ebovar left_op, ebovar right_op)
    Tu n'as pas l'affichage des créations car tu n'as pas écrit le constructeur par copie de ta classe (le compilateur l'a fait pour toi).

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 56
    Par défaut
    Ah ouais!!!

    comme ce sont des classes j'ai remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ebovar operator+(ebovar &left_op, ebovar &right_op)
    Ca ne pourra qu'alle plus vite !
    Merci.

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Pas besoin de pouvoir modifier les opérandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ebovar operator+(ebovar const & left_op, ebovar const & right_op)
    Il faudra corriger l'opérateur de conversion en entier de ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int operator int() const { return i; }
    Citation Envoyé par webshaker Voir le message
    Ca ne pourra qu'alle plus vite !
    Pour les types qui font la taille des types primitifs, ça ne va pas plus vite.
    Les deux codes (ebovar operator+(ebovar const & left_op, ebovar const & right_op) et ebovar operator+(ebovar const left_op, ebovar const right_op)) sont acceptables ici.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 56
    Par défaut
    Merci.

    Tu peux vaguement m'expliquer à quoi sert le const ?
    Si je le met, il ne m'est plus possible d'utiliser d'appeler les méthode de l'object dans la fonction qui surcharge le +

    Ca me dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: passing 'const ebovar' as 'this' argument of 'float ebovar::getFloat()' discards qualifiers
    Ca change quoi de ne pas le mettre ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Les deux codes (ebovar operator+(ebovar const & left_op, ebovar const & right_op) et ebovar operator+(ebovar const left_op, ebovar const right_op)) sont acceptables ici.
    Sauf que faire un passage par copie constante n'a aucun intérêt. Donc ebovar operator+(ebovar const left_op, ebovar const right_op) est à oublier.
    Et je vois pas pour quelle raison tu crois ça acceptable ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Les fonctions d'une classes (aussi appelées méthodes) sont liées à une variable automatique, this, qui est un pointeur vers l'objet sur lequel la fonction est appelée.
    Ainsi, si f est un ebovar, f.getFloat()provoque l'appel de la fonction ebovar::getFloat() avec this=&f.

    Or, il n'est pas possible de prendre un pointeur modifiant sur une valeur constante.
    Il faut donc un moyen de définir this non pas comme un ebovar* mais comme un ebovar const*.
    L'astuce, c'est de placer un const sur la fonction elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class ebovar {
    //je passe les détails...
    public:
        //déclaration
        float getFloat() const;
    
        //déclaration en place
        float getFloat() const {/* ... */}
    };
    
    //définition en dehors d'une fonction membre.
    float ebovar::getFloat() const {/* ... */}

  8. #8
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Sauf que faire un passage par copie constante n'a aucun intérêt. Donc ebovar operator+(ebovar const left_op, ebovar const right_op) est à oublier.
    Et je vois pas pour quelle raison tu crois ça acceptable ?
    Le passage par copie constante a un intérêt sémantique (mais pas plus).

    Remplace ton :
    Citation Envoyé par webshaker Voir le message
    operator float() { return f; }
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float operator float() const { return f; }
    Les const te permettent d'interdire les modifications et donc peuvent permettent d'éviter des erreurs d'étourderies.

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

Discussions similaires

  1. appeler le destructeur dans une fonction
    Par asoka13 dans le forum C++
    Réponses: 3
    Dernier message: 12/05/2008, 00h24
  2. [POO] Appel des destructeurs
    Par Merfolk dans le forum Langage
    Réponses: 2
    Dernier message: 28/03/2008, 17h59
  3. Réponses: 3
    Dernier message: 31/07/2007, 21h18
  4. [Loufoque] Appel de destructeur
    Par Chii-san dans le forum C++
    Réponses: 12
    Dernier message: 18/05/2006, 10h16

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