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 :

reutiliser le constructeur


Sujet :

C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut reutiliser le constructeur
    Bonjour,
    est il propre de re-utiliser le constructeur pour modifier une class non mutable lors d'un operation. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct Point
    {
        Point(float x,float y)
            :x(x),y(y)
        {}
        Point & operator+=(const Point &p)
        {
            this->Point::Point(x+p.x,y+p.y);
            return *this;
        }
        const float x;
        const float y;
    };
    L'operateur += utilise le constructeur pour modifier x et y.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Bonjour,
    est il propre de re-utiliser le constructeur pour modifier une class non mutable lors d'un operation. Par exemple :
    Non, c'est dégueu ! :-)

    Déjà, il me semble que l'opérateur de portée est superflu puisque « this » appartient à ta classe. Ensuite, je crois me souvenir qu'appeler directement un constructeur crée une nouvelle instance, donc ça ne servira à rien dans le cas qui t'intéresse.

    Par contre, tu peux effectivement créer un nouvel objet et l'affecter à l'objet courant, repéré par this.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *this=Point(x+p.x,y+p.y);
    M'enfin, bon. Si tes membres sont const, ce n'est pas pour rien. Si, en revanche, ils ne sont constants que pour être read-only vis-à-vis de l'utilisateur et que tu ne veux pas passer par une méthode pour y accéder (ce que je comprends), moi j'initialise des références constantes publiques sur des objets volatiles privés.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Non, c'est dégueu ! :-)
    En quoi c'est degueu?(j'arrive pas à comprendre pourquoi)
    Déjà, il me semble que l'opérateur de portée est superflu puisque « this » appartient à ta classe. Ensuite, je crois me souvenir qu'appeler directement un constructeur crée une nouvelle instance, donc ça ne servira à rien dans le cas qui t'intéresse.
    C'est pour cela qu'il faut le this. En tout cas sous visual ça marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Par contre, tu peux effectivement créer un nouvel objet et l'affecter à l'objet courant, repéré par this.
    
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *this=Point(x+p.x,y+p.y);
    comme x et y sont const, comment fait tu l'operateur =?

    M'enfin, bon. Si tes membres sont const, ce n'est pas pour rien. Si, en revanche, ils ne sont constants que pour être read-only vis-à-vis de l'utilisateur et que tu ne veux pas passer par une méthode pour y accéder (ce que je comprends), moi j'initialise des références constantes publiques sur des objets volatiles privés.
    En fin c'est un peu un fork de ce thread http://www.developpez.net/forums/d58...-constructeur/

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bon ca y est j'ai trouvé pourquoi c'est dégeu :
    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
     
    struct Point
    {
        Point(float x,float y)
            :x(x),y(y),vect(10000000)
        {}
        Point & operator+=(const Point &p)
        {
            this->Point::Point(x+p.x,y+p.y);
            return *this;
        }
        const float x;
        const float y;
        const std::vector<float> vect;
    };
    dû au vector, à chaque apel de this->Point:: Point(x+p.x,y+p.y); ca va initialiser un vect(10000000) mais il n'y as pas eu destruction de la memoire précédente. Superbe fuite memoire

    dsl pour le derangement

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    En quoi c'est degueu?(j'arrive pas à comprendre pourquoi)

    C'est pour cela qu'il faut le this. En tout cas sous visual ça marche.
    Ben, déjà, ça ne compile pas sous GCC.
    En fait, tu ne peux pas réappeler directement le constructeur puisqu'il n'est par définition valable qu'à la construction d'un objet. Dans cette optique, il faudrait détruire puis recréer x et y pour pouvoir les réinitialiser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *this=Point(x+p.x,y+p.y);
    [/CODE]
    comme x et y sont const, comment fait tu l'operateur =?
    Je viens de vérifier et c'est une erreur de ma part ! Désolé. Il me semblait que l'objet lui-même étant volatile, rien n'empêchait de le réécraser entièrement à partir d'une source construite de la même façon, comporterait-elle des membres constants, mais gcc n'est pas d'accord.

    Par contre, comme je disais au-dessus, tu peux très bien faire ce genre de choses :

    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
     
    class Point
    {
        public:
                   Point (float,float);
     
           const float & x;
           const float & y;
     
        private:
           float priv_x;
           float priv_y;
    };
     
    Point::Point (float px,float py) :
       x(priv_x), y(priv_y), priv_x(px), priv_y(py)
    {
    }
    dû au vector, à chaque apel de this->Point:: Point(x+p.x,y+p.y); ca va initialiser un vect(10000000) mais il n'y as pas eu destruction de la memoire précédente. Superbe fuite memoire
    C'est l'idée mais ce n'est pas le cas. Ton vecteur n'est pas créé dans le tas. Lorsque le précédent objet cessera d'être référencé, il sera détruit, et avec lui tout ses membres, en appelant récursivement tous les destructeurs.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ben, déjà, ça ne compile pas sous GCC.
    En fait, tu ne peux pas réappeler directement le constructeur puisqu'il n'est par définition valable qu'à la construction d'un objet. Dans cette optique, il faudrait détruire puis recréer x et y pour pouvoir les réinitialiser.
    Je viens d'essayer sous code::block, ça ne marche pas. J'était persuadé que c'est ce que fait un pool de memoire.....

    Par contre, comme je disais au-dessus, tu peux très bien faire ce genre de choses :

    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
     
    class Point
    {
        public:
                   Point (float,float);
     
           const float & x;
           const float & y;
     
        private:
           float priv_x;
           float priv_y;
    };
     
    Point::Point (float px,float py) :
       x(priv_x), y(priv_y), priv_x(px), priv_y(py)
    {
    }
    ha ok, pas bête

    C'est l'idée mais ce n'est pas le cas. Ton vecteur n'est pas créé dans le tas. Lorsque le précédent objet cessera d'être référencé, il sera détruit, et avec lui tout ses membres, en appelant récursivement tous les destructeurs.
    J'ai pas tout compris... Mais avec visual, ca compile et ca me fait une jolie fuite memoire avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        Point p(2,3);
     
        while(1)
        {
            p+=Point(3,2);
        }
     
        return 0;
    }

    [edit]
    voila comment faire la même chose avec gcc
    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
     
    struct Point
    {
        Point(float x,float y)
            :x(x),y(y),vect(10000000)
        {}
        Point & operator+=(const Point &p)
        {
            new(this) Point(x+p.x,y+p.y);
            return *this;
        }
        const float x;
        const float y;
        const std::vector<float> vect;
    };

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est plutôt ton code avec gcc qui contient une fuite! Le destructeur de vect n'est jamais appelé!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est plutôt ton code avec gcc qui contient une fuite! Le destructeur de vect n'est jamais appelé!
    sous visual ceci compile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this->Point::Point(x+p.x,y+p.y);
    et fait aussi une fuite memoire.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le problème de faire des classes avec des membres const, c'est que tu ne peux pas les affecter ni les swapper. Résultat, tu n'as plus trop le choix: Tu dois faire des membres non-constants, même si ton interface publique est constante.

    Code C++ : 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
    #include <vector>
    #include <algorithm>
     
    class Point
    {
    public:
    	Point (float,float);
    	//On laisse constructeur de copie et opérateur d'affectation par défaut
    	void Swap(Point &);
     
    	float x() const { return priv_x; }
    	float y() const { return priv_y; }
    	std::vector<float> const & vect() const { return priv_vect; }
     
    private:
    	float priv_x;
    	float priv_y;
    	std::vector<float> priv_vect;
    };
     
    namespace std
    {
     
    template<>
    inline void swap< Point, Point >(Point &a, Point &b)
    {
    	a.Swap(b);
    }
     
    }

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "Point.hpp"
     
    Point::Point (float px,float py) :
     priv_x(px), priv_y(py), priv_vect(10000000)
    {
    }
     
    void Point::Swap(Point &other)
    {
    	std::swap(priv_x, other.priv_x);
    	std::swap(priv_y, other.priv_y);
    	std::swap(priv_vect, other.priv_vect);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le problème de faire des classes avec des membres const, c'est que tu ne peux pas les affecter ni les swapper. Résultat, tu n'as plus trop le choix: Tu dois faire des membres non-constants, même si ton interface publique est constante.
    C'est ce que j'ai compris.
    J'aime bien l'astuce de Obsidian.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Point
    {
        public:
                   Point (float,float);
     
           const float & x;
           const float & y;
     
        private:
           float priv_x;
           float priv_y;
    };

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Mais la présence de références ne rend-elle pas l'objet non-assignable de toute façon?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Si tu veux faire ce genre de choses, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Point & operator+=(const Point &p)
        {
            this->~Point();
            new(this) Point(x+p.x,y+p.y);
            return *this;
        }
    mais cela n'est pas du bon style. En particulier, c'est fragile dans les cas ou le constructeur peut jeter des exceptions (on se retrouve avec un objet detruit qui le sera une deuxieme fois).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Mais la présence de références ne rend-elle pas l'objet non-assignable de toute façon?
    Comme les ref pointe sur des variables privé non const, elle se retrouve être assignable non?

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Comme les ref pointe sur des variables privé non const, elle se retrouve être assignable non?
    Pourquoi?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    car les variables privé son mutable
    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
    class Point
    {
        public:
        Point (float xx,float yy)
         :priv_x(xx),priv_y(yy),x(priv_x),y(priv_y)
         {}
     
        Point & operator =(const Point & p)
       {
          priv_x = p.x;
          priv_y = p.y;
          return *this;
       }
     
           const float & x;
           const float & y;
     
        private:
           float priv_x;
           float priv_y;
    };

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    car les variables privé son mutable
    Le probleme n'est pas les membres prives mais la presence de references. Ce a quoi elles sont initialisees, c'est du detail d'implementation et n'influence pas la validite du code (imagine que les constructeurs ne soient pas inline par exemple).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    imagine que les constructeurs ne soient pas inline par exemple.
    J'ai du mal à comprendre.
    Si le constructeur n'est pas inline, c'est sensé changé quelque chose??

  18. #18
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    J'ai du mal à comprendre.
    Si le constructeur n'est pas inline, c'est sensé changé quelque chose??
    Tu veux que la validite de quelque chose depende du code qui n'est pas visible? Ou alors j'ai mal devine pourquoi tu voudrais pouvoir assigner alors qu'il y a des membres qui sont des references.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  19. #19
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Construire un objet à une adresse où un objet existe déjà est un comportement indéfini.
    Il ne peut y avoir qu'un seul objet à une adresse.
    Boost ftw

  20. #20
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Si tu veux faire ce genre de choses, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Point & operator+=(const Point &p)
        {
            this->~Point();
            new(this) Point(x+p.x,y+p.y);
            return *this;
        }
    mais cela n'est pas du bon style. En particulier, c'est fragile dans les cas ou le constructeur peut jeter des exceptions (on se retrouve avec un objet detruit qui le sera une deuxieme fois).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Point & operator+=(const Point &p)
        {
            Point tmp(x+p.x, y+p.y);
            std::swap(*this, tmp);
            return *this;
        }
    Problème résolu.
    Boost ftw

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Reflection] Récupérer un constructeur ayant un paramètre int
    Par narmataru dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/07/2004, 09h53
  2. [VB6]Déclaration d'un Constructeur Spécialisé
    Par TagadaTsoin dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 26/05/2004, 14h09
  3. [Constructeur]Pb avec la surcharge d un constructeur
    Par cmoulin dans le forum Langage
    Réponses: 3
    Dernier message: 26/04/2004, 09h29
  4. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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