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 :

prob avec constructeur par copie et variable static


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par d�faut prob avec constructeur par copie et variable static
    Bonjour!
    voila mon prob j'ai cr�e une classe point avec une donn�e static compteur qui s'incr�mente ds le constructeur et se d�cr�mente dans le destructeur.
    lorque je d�clare par exemple point a(2,5) et b(3,6) le compteur affiche 2 c�d j'ai deux objets de type point mais si j'ecrit a(2,5) et pointb=a le compteur affiche 1 c�d un suel objet je veux comprendre est dans le 2eme cas il y a qu'un seul objet ou deux a et b et merci
    voila mon code source
    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
    #include <iostream.h>
    class point{
    	static int compteur;
    	int x ;
    	int y ;
    public :
    	point (int &, int&) ;
    	void deplace (int, int) ;
    	void affiche () ;
    	~point () ;
    } ;
    int point::compteur=0;
    point::point (int &abs, int &ord)
    {x = abs ; y = ord ;compteur++;
    cout<<"il existe "<<compteur <<" points "<<this<<endl ;
    }
    void point::deplace (int dx, int dy)
    { x = x + dx ; y = y + dy ;
    }
    void point::affiche ()
    { cout << "Je suis en " << x << " " << y << "\n" ;
    }
    point::~point () {compteur--;
    cout<<"il existe "<<compteur <<" points"<<endl ;
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    /* -------- Utilisation de la classe point -------- */
    main()
    {
    point a(10,55);
    //b(4,5)
    point b=a;
    }

  2. #2
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Bonjour,
    Je pense que du au fait que tu n'as pas d�finit d'operator=
    Dans ton code, le compilot va le cr�er � ta place et faire des = sur tout les membre, dont compteur.
    Apr�s ca va surement d�pendre du compilatur

  3. #3
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    Le compilo te cr�� automatiquement un op�rateur d'affectation et copie juste membre � membre. Quand tu cr��s deux objets, le constructeur est appel� deux fois, ton compteur est donc incr�ment� deux fois. Lorsque tu en cr�� un, et que tu fais : point b=a; Le compilateur copie membre � membre, mais n'incr�mente pas ton compteur. Ce que tu dois faire, comme l'a dit Montgaulois, c'est red�finir l'op�rateur = :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    Point & Point::operator= (const Point & monPoint)
    {
       x = monPoint.x;
       y = monPoint.y;
       ++compteur;
    }

  4. #4
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Citation Envoy� par Bakura Voir le message
    Le compilo te cr�� automatiquement un op�rateur d'affectation et copie juste membre � membre. Quand tu cr��s deux objets, le constructeur est appel� deux fois, ton compteur est donc incr�ment� deux fois. Lorsque tu en cr�� un, et que tu fais : point b=a; Le compilateur copie membre � membre, mais n'incr�mente pas ton compteur. Ce que tu dois faire, comme l'a dit Montgaulois, c'est red�finir l'op�rateur = :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    Point & Point::operator= (const Point & monPoint)
    {
       x = monPoint.x;
       y = monPoint.y;
       ++compteur;
    }
    En y r�fl�chissant , je croit que l'on as dit une b�tise. Ce n'est pas que l'op�rateur = qu'il faut red�finir , mais la cr�ation par recopie aussi. L'operateur = ne devrait pas incr�ment� compteur.
    sinon
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    point a(-1,5);
    point b =a;//indéfinie même avec un operateur = ??? je sais pas
     
    b=a; //compteur++
    b=a; //compteur++
    et
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     point b = a <=> point b(a);//il me semble

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par d�faut
    Salut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    point b = a <=> point(const point & a)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    point(const point & a)
    {
        *this=a;
    }
    voila comment j'ai compris la chose d'abord le compilateur fait un copie du point a sous forme de constant c�d avec les valeurs de a.x a.y et compteur=1 puis reserve l'espace pour b (on sait que le constructeur et appel� apres la creation de l'objet) puis il transmet les valeurs qui sont d�ja copi�es aux attributs de b c�d ceux du point a .
    il me semble mais ??

  6. #6
    screetch
    Invit�(e)
    Par d�faut
    tout ce qui est CONSTRUCTEUR doit incrementer le compteur
    tout ce qui est DESTRUCTEUR doit decrementer
    tout ce qui est OPERATEUR DE RECOPIE ne doit pas y toucher, ce n'est pas un nouvel objet.

    Dans la liste que t'a donn� koala, il a parl� :

    -d'un constructeur par defaut, vide : celui ci est gener� par le compilateur si tu n'en fournis aucun autre. Si tu fournis un constructeur alors il ne sera pas gener�, mais tu peux en creer un. Si tu en cr�es un, c'est un constructeur donc incremente le compteur.
    - d'un constructeur par recopie : celui ci est gener� par le compilateur si tu n'en donnes pas. Celui gener� par le compilateur ne fera pas l'incrementation, il faut que tu lui en fournisses un qui fait l'incrementation.
    - d'un destructeur : si tu n'en fournis pas, il sera gener� automatiquement, mais tu en as un dans ta classe qui decremente le compteur
    - d'un operateur de recopie : celui ci n'est pas un constructeur. Soit tu en fournis un soit le compilateur le genere pour toi.

  7. #7
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    Citation Envoy� par Mongaulois Voir le message
    En y r�fl�chissant , je croit que l'on as dit une b�tise. Ce n'est pas que l'op�rateur = qu'il faut red�finir , mais la cr�ation par recopie aussi. L'operateur = ne devrait pas incr�ment� compteur.
    sinon
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    point a(-1,5);
    point b =a;//indéfinie même avec un operateur = ??? je sais pas
     
    b=a; //compteur++
    b=a; //compteur++
    et
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     point b = a <=> point b(a);//il me semble
    En effet, j'ai dis une grosse connerie

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par d�faut je pense que c'est Resolu !!
    merci a tous
    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
     
    #include <iostream.h>
    class point{
            int x ;
            int y ;
    public :
            static int compteur;
            point (int , int) ;
            point(const point &p);	
            ~point () ;
     
            } ;
    int point::compteur=0;
    point::point (int abs, int ord) //: x(abs), y(ord),nom(p)
    {
            x = abs ; y = ord ;
            compteur++;
            cout<<"il existe "<<compteur <<" points "<<endl ;
    }
     
    point::point(const point &p)
    {
            this->x = p.x ; this->y = p.y ;
            compteur++;
            cout<<"il existe "<<compteur <<" points "<<endl ;
    }
    point::~point ()
    {
            compteur--;        
            cout<<"il existe "<<compteur <<" points"<<endl ;
    }
    main()
    {
            point a(10,55);  //incrémente le compteur
            point b=a;//incrémente le compteur
            point c(a);    //incrémente le compteur
            a=b;  //n'incréménte pas le compteur 
            cout<<"compteur ="<<point::compteur<<endl<<endl; // affiche le nombre d'ibjets
    }
    �a marche tr�s bien !

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par d�faut re
    Merci Mongaulois
    je pense operator = est obligatoire lorsque il y a des pointeurs dans la classe
    en plus une donn�e static est une donn�e de classe c�d il y a un compteur partag� par tous les objets

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par d�faut re
    merci Bakura & Mongaulois
    j'ai compris

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

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Il y a quatre m�thodes qui sont cr��es d'office par le compilateur - quel qu'il soit - s'il n'existe aucune m�thodes cr��e par l'utilisateur pour en tenir lieu.

    Ce sont:
    • Le constructeur par d�faut (ne prenant aucun param�tre obligatoire) qui ne sera cr�� que si aucun constructeur "classique" n'est cr�� par l'utilisateur
    • le constructeur par copie, dont il faut garder en t�te que, par d�faut, il s'agit d'une copie membre � membre (avec les probl�me connus en ce qui concerne les pointeurs)
    • le destructeur
    • l'op�rateur d'affectation


    Ces quatre m�thodes, commun�ment connue sous le nom des big four doivent �tre impl�ment�es - fusse par le compilateur - afin d'assurer la mise en oeuvre de l'idiome RAII(Ressouces Aquisition Is Initialisation)
    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

Discussions similaires

  1. R�ponses: 24
    Dernier message: 08/05/2008, 17h30
  2. Petit probl�me avec le constructeur par copie
    Par beegees dans le forum C++
    R�ponses: 16
    Dernier message: 01/04/2008, 16h34
  3. [Debutant] Probl�me avec un constructeur par copie
    Par Drannor dans le forum D�buter
    R�ponses: 5
    Dernier message: 12/03/2007, 09h15
  4. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    R�ponses: 5
    Dernier message: 13/12/2005, 19h15
  5. [deb.]Constructeur par copie
    Par Marc_3 dans le forum D�buter
    R�ponses: 4
    Dernier message: 19/11/2005, 13h33

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