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 :

surcharge operateur =


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut surcharge operateur =
    Bonjour,
    je suis debutant en c++ et j'ai besoin de votre aide sur un point delicat. Je dois effectuer une surcharge de l'operateur = sur une classe fille avec des attributs const. J ai du mal a comprendre comment attribuer les bons arguments aux champs privates de la classe mere. De plus je ne comprends pas pourquoi le compiler refuse la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     StartAge = o.GetStartAge
    Voici le code en entier:
    (les consignes de l'exercice m'obligent a ne pas modifier la classe mere)

    classe mere:
    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
     
    class CBaseApplication
    {
    public:
     
        // Class constructor receives this application name.
        CBaseApplication(const string strName);
     
        // Class destructor.
        virtual ~CBaseApplication();
     
     
        // This function returns this application name.
        string GetName() const
        {
            return m_strName;
        }
     
    private:
     
        // Private copy constructor and assignment operator in order to prevent
        // this object copying.
        CBaseApplication(const CBaseApplication& o);
        CBaseApplication& operator=(const CBaseApplication& o);
     
        // The application name.
        const string m_strName;
     
    };
     
    CBaseApplication::CBaseApplication(const string strName): m_strName(strName)
    {
    }
     
    CBaseApplication::~CBaseApplication()
    {
    }
    classe fille:
    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
    class CGame : public CBaseApplication
    {
    public:
        CGame(const string strName = "", int start = 0, int end = 99); //constructeur
    
    	CGame(const CGame& o);// constructeur par recopie
    
    	CGame& operator=(const CGame& o){
    		//Comment recopier le nom du game ??
    		StartAge = o.GetStartAge;
    		EndAge = o.GetEndAge;
    		return this;
    	}
    
    	
    	int GetStartAge() const{ 
    		return StartAge; 
    	} 
    	int GetEndAge() const{ 
    		return EndAge; 
    	} 
    
    private:
    	const int StartAge;
    	const int EndAge;
    };
    
    CGame::CGame(const string strName, int start, int end): CBaseApplication(strName), StartAge(start), EndAge(end)
    {
    	if ((start < 0) || (start > 99) || (end < 0) || (end > 99) || (start < end))
    		throw CWrongAgeException();
    }
    
    CGame::CGame(const CGame& o): CBaseApplication(o.GetName()), StartAge(o.StartAge), EndAge(o.EndAge){
    }
    La classe mere ne peut pas etre modifie. La classe peut etre totalement modifie mais les champs prives doivent restes const.

    Merci pour votre aide.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par Mikaelv2 Voir le message
    Je dois effectuer une surcharge de l'operateur = sur une classe fille avec des attributs const.
    Ça commence mal
    C'est doublement impossible.
    1) On ne surcharge pas l'opérateur = d'une classe fille
    2) Une classe possédant des membres const ne peut pas avoir d'opérateur =.

    De plus je ne comprends pas pourquoi le compiler refuse la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     StartAge = o.GetStartAge
    Parce que StartAge est const, il ne peut pas changer de valeur.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    On en voit passer des exercices vraiment nuls mais celui-là il doit établir une sorte de record...

    Cela étant posé, tu peux toujours faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CGame& operator=(const CGame& o){
        new(this)CBaseApplication( o.GetName() );
        const_cast< int& >( StartAge ) = o.StartAge;
        const_cast< int& >( EndAge ) = o.EndAge;
        return *this;
    }
    Et ensuite tu peux aller casser quelques rotules au bouquin/site/prof qui file ce genre d'exercice (et passe les std::string par copie).

    ps : je mets ce code mais je ne le cautionne absolument pas, voire même je doute fort que (si tu es débutant en C++) ça soit vraiment la réponse qu'on attende de toi...

    MAT.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Surtout qu'il y a des destructeurs qui se perdent dans ce code.
    Je pense que la MOINDRE des choses serait un copy-swap.
    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.

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par Mikaelv2 Voir le message
    De plus je ne comprends pas pourquoi le compiler refuse la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     StartAge = o.GetStartAge
    Huh, il manque pas simplement les parenthèses ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     StartAge = o.GetStartAge();
    Sinon quel est le message d'erreur généré ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Surtout qu'il y a des destructeurs qui se perdent dans ce code.
    Comment ça ?

    Citation Envoyé par Médinoc Voir le message
    Je pense que la MOINDRE des choses serait un copy-swap.
    En fait c'est de toute façon plus simple de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CGame& operator=(const CGame& o){
        return *new(this)CGame( o );
    }
    ...

    MAT.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Si tu fais new(this) CGame(o), et que la classe CGame (ou une de ses variables membres) possède un destructeur, celui-ci ne sera pas appelé.

    Par contre, en copy-swap, on n'a pas ce genre de problème. Et on pourra mettre tous les const_cast<> dans l'implémentation de CGame::Swap(CGame &) et de(s) classe(s) mère(s)...
    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
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si tu fais new(this) CGame(o), et que la classe CGame (ou une de ses variables membres) possède un destructeur, celui-ci ne sera pas appelé.
    En effet, en l'occurence il y a le std::string qui pose problème...

    Citation Envoyé par Médinoc Voir le message
    Par contre, en copy-swap, on n'a pas ce genre de problème. Et on pourra mettre tous les const_cast<> dans l'implémentation de CGame::Swap(CGame &) et de(s) classe(s) mère(s)...
    Oui c'est sûr, mais comme on ne peut pas modifier le code de la classe mère, on ne peut pas lui ajouter de swap...

    MAT.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Et on pourra mettre tous les const_cast<> dans l'implémentation de CGame::Swap(CGame &) et de(s) classe(s) mère(s)...
    Sauf que modifier un objet const est un comportement undéfini.

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Bon du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CGame& operator=(const CGame& o){
        if( this != &o )
        {
            this->~CGame();
            new(this)CGame( o );
        }
        return *this;
    }
    En fait c'est donné comme exemple dans le standard (clause 3.8, paragraphe 7).
    Mais c'est sûr ça fait un peu grimacer de voir ça, d'ailleurs il y a toute une discussion sur cet anti-idiome dans Exceptional C++ (Item 41) avec une liste de 'problèmes' longue comme le bras...

    MAT.

Discussions similaires

  1. surcharge operateur delete et héritage
    Par Hervé dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2006, 13h59
  2. Surcharge operateur =
    Par rulianf dans le forum C++
    Réponses: 9
    Dernier message: 23/02/2006, 00h32
  3. [debutante] surcharge operateur <<
    Par norkius dans le forum Débuter
    Réponses: 3
    Dernier message: 24/10/2005, 12h20
  4. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51
  5. surcharge operateur && pointeurs
    Par le y@m's dans le forum C++
    Réponses: 6
    Dernier message: 10/05/2005, 15h57

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