Appel du destructeur inopinément [Résolu]

Signaler
Messages postés
8
Date d'inscription
dimanche 22 octobre 2006
Statut
Membre
Dernière intervention
10 novembre 2006
-
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
-
Bonjour à tous... Voilà j'ai un petit problème. J'ai crée une classe complex dans laquelle j'ai defini quelques méthodes. Jusqu'ici rien de bien passionnant....
Cependant des que j'utilise une méthode qui prend un objet de cette même classe comme argument, l'execution appel le destructeur juste avant l'execution de la méthode...
Je vous montre un petit exemple:

++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++
complex.H:
#include
using namespace std;

class complex
{
    double real_part;
    double imaginary_part;
    // Friend function :
    friend void module(complex a,double &mod);

public :
    // Constructor
    complex();
    complex(double a, bool b);
    complex(double a, double b);
    complex (const complex &source_complex); // copy constructor

    // Operator overloading
    complex operator = (complex);
    bool operator == (complex);
    complex operator + (complex);

    virtual void display();
    virtual complex multiplication(const complex a);
    virtual complex multiplication(double b);

   
    // Destructor
    virtual ~complex();
};

void module(const complex a,double &mod);
+++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++

des que j'appel par exemple la fonction module, le destructeur est appelé (je le sais car j'ai demandé qu'il affiche une phrase des qu'il est appelé...)
j'obtiens

+++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++
MAIN

#include
#include "Class_complex.h"

using namespace std;

int main()
{
    int exit; bool essai=false; double mod;
    complex a= complex (2.0,3.0);
    complex b=a.multiplication(2.);
    complex c= complex(1.0,2.0);
    complex d= a.multiplication (c);
    b.display();
    cout << endl;
    d.display();
    cout << endl;
    complex e=complex(a);
    e.display();
    module(e,mod);
    cout << mod << endl;

    return 1;
   
}

J'obtiens

The complex number was destroyed
4 + i*6

-4 + i*7

2 + i*3
The complex number was destroyed          <- juste avant module le destructeur
3.60555                                                      <- appel de la function module
The complex number was destroyed
The complex number was destroyed
The complex number was destroyed
The complex number was destroyed
The complex number was destroyed

complex has exited with status 1.

Je suis un peu perdu, merci d'avance

3 réponses

Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
Salut,

Ta méthode module fait appel en parametre a un complex nommé a:
friend void module(complex a,double &mod);

Lorque tu appel module la variable a est allouer et construite "par copie" du parametre que tu lui donne

Donc lorsque l'instruction est terminé, la variable complex a est local a la fonction module, elle est détruite avant que tu n'affiche le resultat "mod".

De manière générale, il ffaut définir cette forme au minimum si tu ne veux pas de surprise d'allocation/desallocation hasardeuse.

Complex(); // constructeur par défault
~Complex() ; // destructeur
Complex(const Complex &) ; //par copie
Complex& operator=(const Complex &) ; // operateur =

De plus, passe ta classe en parametre "reference constante" quelquesoit
tes méthodes, ces moins lourd à gérer et évite les
aloocations/desallocations de parametres (quand ce n'est pas natif)

D'autre part, je te conseille de créer une méthode pour obtenir le module de ton complex (c'est un conseil)

double module()

Complex c;
c.module() te retourne le module

Vala

Mad_Love_Disease
Messages postés
8
Date d'inscription
dimanche 22 octobre 2006
Statut
Membre
Dernière intervention
10 novembre 2006

Merci bcp
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
De rien,

On est la pour ça..... Bon courage pour la suite.

Mad_Love_Disease