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 :

Copie instance d'une class avec changement d'attribut


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur C# - SQL
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C# - SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Copie instance d'une class avec changement d'attribut
    Bonsoir à tous,

    Je voulais savoir par quel moyen peut-on en c++ copier une instance d'une classe en modifiant certains de ces attributs; je m'explique: j'ai une classe Chat et je veux via une méthode Chat reproduction() copier une instance c1 en modifiant certains de ses attributs. Imaginons que mon chat a un attribut string couleur initialisé à "noir" et un attribut int vie initialisé à 7 et qu'en faisant Chat c2 = c1.reproduction(); cela me crée un nouveau chat c2 ayant une couleur grise mais qu'en même temps c1 perde 1 point de vie. J'ai essayé de décrémenter l'attribut force directement via le constructeur ou le constructeur de recopie sans succès car cela m'initialise le chat initial (c1) avec une force déjà rétrogradée avant reproduction (c1.force = 7) ce qui n'est conforme à ce qui est attendu, c'est à dire c1.force = 7.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public:
    	Chat (string nom = "Miaou", int force = 7, string couleur  = "noir")
    	: nom(nom),  force(force), couleur(couleur)
    	{
     
    	}
     
    	Chat (Chat const& c)
    	: nom(c.nom), force((c.force)), couleur(c.couleur)
    	{
    Merci pour votre aide.

    Bien cordialement,
    IT

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 107
    Points
    107
    Par défaut
    Quelque chose dans ce style là ?

    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
    struct Chat
    {
        std::string         m_nom;
        int                 m_force;
        std::string         m_couleur;
     
        Chat () {};
        Chat (std::string nom, int force, std::string couleur) : m_nom(nom), m_force(force), m_couleur(couleur) {};
     
        Chat reproduction()
        {
            m_force--;
            return Chat(m_nom, m_force+1, m_couleur);
        }
    };
     
     
    int main()
    {
        Chat c1;
        c1.m_force = 7;
     
        Chat c2 = c1.reproduction();
     
        std::cout<<c1.m_force; // affiche 6
        std::cout<<c2.m_force; // affiche 7
     
        return 0;
    }

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 202
    Points : 12 358
    Points
    12 358
    Par défaut
    Plus simple :
    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
    struct Chat
    {
        std::string         nom;
        int                 force;
        std::string         couleur;
     
        Chat (string nom = "Miaou", int force = 7, string couleur  = "noir") : nom(nom),  force(force), couleur(couleur) {};
     
        Chat (Chat const& c): nom(c.nom), force((c.force)), couleur(c.couleur)	{ }
     
        Chat reproduction()
        {
            return Chat(m_nom+"-"+m_nom, m_force, "gris");
            m_force--;
        }
    };

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 072
    Points
    33 072
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Chat reproduction()
        {
            return Chat(m_nom+"-"+m_nom, m_force, "gris");
            m_force--;
        }
    Le premier compilo venu t'annoncera un warning "code unreachable".
    Ton constructeur par copie est inutile, celui par défaut aura le même comportement. En plus, si besoin d'un constructeur par copie, on aura aussi généralement besoin d'un opérateur d'affectation, et souvent du destructeur.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 202
    Points : 12 358
    Points
    12 358
    Par défaut
    Oups

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct Chat
    {
        std::string         nom;
        int                 force;
        std::string         couleur;
     
        Chat (string nom = "Miaou", int force = 7, string couleur  = "noir") : nom(nom),  force(force), couleur(couleur) {};
     
        Chat reproduction()
        {
            return Chat(nom+"-"+nom, force--, "gris");
        }
    };

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    La réflexion à retenir, c'est que puisque tu ne veux pas faire une copie (au sens de duplicatat), il vaut mieux faire une fonction dédiée.

    La méthode proposée par mes prédécesseurs reproduit le concept de clonable, ou un objet n'est pas copiable, mais dispose d'une fonction clone().

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur C# - SQL
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C# - SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par MrPchoun Voir le message
    Quelque chose dans ce style là ?

    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
    struct Chat
    {
        std::string         m_nom;
        int                 m_force;
        std::string         m_couleur;
     
        Chat () {};
        Chat (std::string nom, int force, std::string couleur) : m_nom(nom), m_force(force), m_couleur(couleur) {};
     
        Chat reproduction()
        {
            m_force--;
            return Chat(m_nom, m_force+1, m_couleur);
        }
    };
     
     
    int main()
    {
        Chat c1;
        c1.m_force = 7;
     
        Chat c2 = c1.reproduction();
     
        std::cout<<c1.m_force; // affiche 6
        std::cout<<c2.m_force; // affiche 7
     
        return 0;
    }
    Merci je l'ai traduite en classe Chat et cela fonctionne impeccablement.

    Cordialement,
    IT

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 072
    Points
    33 072
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_force--;
            return Chat(m_nom, m_force+1, m_couleur);
    peut s'écrire tout simplement return Chat(m_nom, m_force--, m_couleur);, en connaissant comment fonctionne le post-opérateur --/++

  9. #9
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 746
    Points : 3 667
    Points
    3 667
    Par défaut
    @Bousk: petite bévue: return Chat(m_nom, m_force--, m_couleur);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/10/2012, 23h37
  2. Réponses: 8
    Dernier message: 07/12/2009, 15h26
  3. Réponses: 1
    Dernier message: 05/11/2009, 12h14
  4. Instance d'une classe avec une string
    Par beetlejuice722 dans le forum C#
    Réponses: 30
    Dernier message: 31/10/2008, 11h43
  5. Réponses: 2
    Dernier message: 26/10/2006, 11h13

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