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 :

bizare comme programme


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut bizare comme programme
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    #include <iostream>
    using namespace std;
     
    class complexe
    {
        int reel,imag;
        static int nombre;
        public :
        static int getValue();
        complexe(int r=0,int i=0):reel(r),imag(i) {nombre++;}
        ~complexe() {nombre--;}
        int& getReel() {return reel;}
        int& getImag() {return imag;}
        void affiche();
        friend complexe operator+ (complexe c1,complexe c2);
        complexe operator= (complexe c);
        complexe operator+= (complexe c);
        friend int operator== (complexe c1,complexe c2);
        friend istream& operator>> (istream& i,complexe& c);
        friend ostream& operator<< (ostream& o,complexe& c);
        int& operator[] (int i);
        complexe operator++ ();
        complexe operator++ (int);
        operator int();
    };
     
    int complexe::nombre = 0;
     
    int complexe::getValue()
    {
        return nombre;
    }
     
    void complexe::affiche()
    {
        cout <<reel<<"+i"<<imag<<endl;
    }
     
    complexe operator+ (complexe c1,complexe c2)
    {
        complexe res;
        res.getReel() = c1.getReel() + c2.getReel();
        res.getImag() = c1.getImag() + c2.getImag();
        return(res);
    }
     
    complexe complexe::operator= (complexe c)
    {
        if(this != &c)
        {
            reel = c.reel;
            imag = c.imag;
        }
        return(*this);
    }
     
    complexe complexe::operator+= (complexe c)
    {
        reel += c.reel;
        imag += c.imag;
        return(*this);
    }
     
    int operator== (complexe c1,complexe c2)
    {
        if(c1.getReel() == c2.getReel() && c1.getImag() == c2.getImag())
            return 1;
        return 0;
    }
     
    istream& operator>> (istream& i,complexe& c)
    {
        cout<<"Partie reel :\n";
        i>>c.getReel();
        cout<<"Partie imaginaire :\n";
        i>>c.getImag();
        return i;
    }
     
    ostream& operator<< (ostream& o,complexe& c)
    {
        o<<c.getReel()<<"+i"<<c.getImag()<<endl;
        return o;
    }
     
    int& complexe::operator[] (int i)
    {
        if(i==1)
            return(reel);
        return(imag);
    }
     
    complexe complexe::operator++ ()
    {
        ++reel;
        ++imag;
        return(*this);
    }
     
    complexe complexe::operator++ (int i)
    {
        complexe tmp = *this;
        tmp.reel++;
        tmp.imag++;
        return(tmp);
    }
     
    complexe::operator int()
    {
        return reel;
    }
     
    /********************************/
    int main()
    {
        complexe* c1 = new complexe(2,8);
        cout << complexe::getValue() << endl;
        complexe* c2 = new complexe(1,3);
        cout << complexe::getValue() << endl;
        complexe* c3 = new complexe(1,3);
        cout << complexe::getValue() << endl;
        *c3 = *c1 + *c2;
        cout << complexe::getValue() << endl;
        cout << *c1 << *c2 << *c3;
        delete c1;
        delete c2;
        delete c3;
        cout << complexe::getValue() << endl;
        return 0;
    }
    /********************************/
     
     
    /**** ECRAN EXECUTION ***/
     
    $ ./test
    1
    2
    3
    0
    2+i8
    1+i3
    3+i11
    -3
    ==========

  2. #2
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut nombre instances bizarre !
    PQ avant de detruire les pointeurs , le nombre d'instances passe à zero ???

  3. #3
    screetch
    Invité(e)
    Par défaut
    parce qu'il existe un autre moyen de construire des complexes, c'est de les copier a partir d'un autre complexe. ce code est généré par le compilateur si tu ne le fournis pas. et comme c'est un autre moyen de construire des complexes, il devrait aussi incrementer le nombre d'instances.

  4. #4
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut
    Citation Envoyé par screetch Voir le message
    parce qu'il existe un autre moyen de construire des complexes, c'est de les copier a partir d'un autre complexe. ce code est généré par le compilateur si tu ne le fournis pas. et comme c'est un autre moyen de construire des complexes, il devrait aussi incrementer le nombre d'instances.
    oui il y en a un autre , celui du constructeur par copie , mais là ! ds mon programme il n'ya pas appel au constructeur par copie, j'appelle le constructeur complexe(int,int) à chaque fois et cé ça qui est bizarre ! le nombre est 3 et aprés avant de liberer la memoire ca passe à 0!

  5. #5
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    en fait lorsque dans tes opérateurs + et = tu ne passes pas par référence, le constructeur par copie est appelé.

    Voilà avec les références:
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    #include <iostream>
     
    using namespace std;
     
    class complexe
    {
            int reel,imag;
            static int nombre;
        public :
            static int getValue();
            complexe(int r=0,int i=0):reel(r),imag(i) {
                nombre++;
            }
            ~complexe() {
                nombre--;
            }
            int& getReel() {
                return reel;
            }
            int& getImag() {
                return imag;
            }
            void affiche();
            friend complexe operator+ (complexe& c1,complexe& c2);
            complexe& operator= (complexe c);
            complexe& operator+= (complexe c);
            friend int operator== (complexe &c1,complexe &c2);
            friend istream& operator>> (istream& i,complexe& c);
            friend ostream& operator<< (ostream& o,complexe& c);
            int& operator[] (int i);
            complexe operator++ ();
            complexe operator++ (int);
            operator int();
    };
     
    int complexe::nombre = 0;
     
    int complexe::getValue()
    {
        return nombre;
    }
     
    void complexe::affiche()
    {
        cout <<reel<<"+i"<<imag<<endl;
    }
     
    complexe operator+ (complexe& c1,complexe &c2)
    {
        complexe res;
        res.getReel() = c1.getReel() + c2.getReel();
        res.getImag() = c1.getImag() + c2.getImag();
        return(res);
    }
     
    complexe& complexe::operator= (complexe c)
    {
        if (this != &c)
        {
            reel = c.reel;
            imag = c.imag;
        }
        return(*this);
    }
     
    complexe& complexe::operator+= (complexe c)
    {
        reel += c.reel;
        imag += c.imag;
        return(*this);
    }
     
    int operator== (complexe& c1,complexe& c2)
    {
        if (c1.getReel() == c2.getReel() && c1.getImag() == c2.getImag())
            return 1;
        return 0;
    }
     
    istream& operator>> (istream& i,complexe& c)
    {
        cout<<"Partie reel :\n";
        i>>c.getReel();
        cout<<"Partie imaginaire :\n";
        i>>c.getImag();
        return i;
    }
     
    ostream& operator<< (ostream& o,complexe& c)
    {
        o<<c.getReel()<<"+i"<<c.getImag()<<endl;
        return o;
    }
     
    int& complexe::operator[] (int i)
    {
        if (i==1)
            return(reel);
        return(imag);
    }
     
    complexe complexe::operator++ ()
    {
        ++reel;
        ++imag;
        return(*this);
    }
     
    complexe complexe::operator++ (int i)
    {
        complexe tmp = *this;
        tmp.reel++;
        tmp.imag++;
        return(tmp);
    }
     
    complexe::operator int()
    {
        return reel;
    }
     
    /********************************/
    int main()
    {
        complexe* c1 = new complexe(2,8);
        cout << complexe::getValue() << endl;
        complexe* c2 = new complexe(1,3);
        cout << complexe::getValue() << endl;
        complexe* c3 = new complexe(1,3);
        cout << complexe::getValue() << endl;
        *c3 = *c1 + *c2;
        cout << complexe::getValue() << endl;
        cout << *c1 << *c2 << *c3;
        delete c1;
        delete c2;
        delete c3;
        cout << complexe::getValue() << endl;
        return 0;
    }

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    Je dirai meme plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    complexe& operator= (complexe& c);
            complexe& operator+= (complexe& c);
    Mais je pense que c'est un simple oubli.
    De plus, tu n'as pas surcharge le constructeur de recopie pour qu'il incremente le nombre de complexes, donc voila ce qui se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    1. complexe* c1 = new complexe(2,8); 
    2. complexe* c2 = new complexe(1,3); 
    3. complexe* c3 = new complexe(1,3); 
    4. *c3 = *c1 + *c2; 
    5. delete c1;
    6. delete c2;
    7. delete c3;
    Lignes 1, 2 et 3 : appel du constructeur, N = 3 a l'issue de ces lignes.
    Ligne 4 : Creation de 2 varibales locales pour l'addition et d'1 variable locale pour l'affectation, tout cela utilisant le constructeur de recopie, N ne change pas. A la sortie de l'addition, destruction des 2 variables locales, donc appel du destructeur : N = N-2. A la sortie de l'affectation, une destruction de plus, N = N-1, soit N=0 !
    Puis lignes 5, 6 et 7 appel du destructeur surcharge sur les variables de ta fonction main: N=-3 :/

Discussions similaires

  1. Bizar comme probleme
    Par scholes dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/01/2012, 07h37
  2. [AC-2010] Lancement d'access comme programme
    Par scoobydoos dans le forum Sécurité
    Réponses: 12
    Dernier message: 27/10/2010, 21h21
  3. Comme reduire par programme un nom de variable ?
    Par ludobado dans le forum Access
    Réponses: 1
    Dernier message: 26/04/2006, 17h51
  4. Ajouter un programme comme thread (?)
    Par sloshy dans le forum Windows
    Réponses: 5
    Dernier message: 22/02/2006, 10h07
  5. Réponses: 3
    Dernier message: 09/02/2004, 14h35

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