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 : 105
    Points
    105
    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;
    }
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    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 074
    Points : 12 120
    Points
    12 120
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    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 074
    Points : 12 120
    Points
    12 120
    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 189
    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 189
    Points : 17 141
    Points
    17 141
    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().
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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 --/++
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    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 : 739
    Points : 3 627
    Points
    3 627
    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, 22h37
  2. Réponses: 8
    Dernier message: 07/12/2009, 14h26
  3. Réponses: 1
    Dernier message: 05/11/2009, 11h14
  4. Instance d'une classe avec une string
    Par beetlejuice722 dans le forum C#
    Réponses: 30
    Dernier message: 31/10/2008, 10h43
  5. Réponses: 2
    Dernier message: 26/10/2006, 10h13

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