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++Builder Discussion :

Copie objet pointeur


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 94
    Par défaut Copie objet pointeur
    Bonjour,

    Je voudrais copier un objet dynamique,

    Je suis dans ma classe où j'ai créé mon objet pointeur (contenant d'autres pointeur) s'appelant MonObjet1 de type Objet et je voudrais une copie intégrale de cette objet dynamique mais bien sûre en ayant une autre adresse pointeur,
    Comment faire ?

    Merci de votre temps !

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    il faut que tu regarde si dans la classe dont tu créé l'instance il y a un constructeur par recopie (un constructeur qui prend comme paramètre un pointeur sur une instance d'elle même), sinon c'est impossible a mois que toutes les propriétés soit en pulic, ce qui est plutôt rare

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 94
    Par défaut
    Bonsoir et merci de la réponse,

    En fait ce sont mes classes, donc je peux les manipuler comme je veux...
    Je n'ai jamais eu besoin de ça, jusqu'à aujourd'hui, et mes cours son loin...
    Je me souvenais vaguement du constructeur par recopie,
    Mais en gros je déclare un deuxième constructeur, dans lequel je met la déclaration pour le constructeur de copie, et quand j'appellerai ce dernier, il me fera une copie global de tout ? même les objets dynamiques à l'intérieur ?

    Merci !

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Vu que c'est tes classe tu peut donc bien créer un constructeur par copie, mais rien est automatique, il faut que tu le fasse. Pour cela il faut que tu déclare un deuxième constructeur qui aura un paramètre qui est une instance de la classe. Et dans le code de ce constructeur, tu vas mettre tu ce que tu veut qu'il soit copié.

    Exemple avec un classe Toto :

    Voir le code de Medinoc ci-dessous

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Un "constructeur de copie" qui prend un pointeur en paramètre? Hérésie!

    Voici un exemple avec une variable pointeur allouée dynamiquement.
    La présence de cette variable oblige à définir soi-même le constructeur, le constructeur de copie, l'opérateur d'affectation et le destructeur.
    Pour l'affectation, on utilise l'idiome copy-and-swap.
    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
    class Toto{
    private :
    	char * nom;
    	int nbYeux;
    	int nbBras;
    	int nbJambes;
    	int nbCheveux;
    public :
    	Toto(void);             //constructeur par défaut
    	Toto(Toto const &);     //constructeur par copie
    	~Toto(void);            //destructeur
    	Toto & operator=(Toto); //opérateur d'affectation
    	void Swap(Toto &);      //fonction d'échange
     
    	static char * mystrdup(char const *str); //Fonction qui alloue une chaîne sur le tas.
    };
     
    //Spécialisation de std::swap()
    #include <algorithm>
     
    namespace std
    {
    template<>
    void swap(Toto &left, Toto &right)
    {
    	left.Swap(right);
    }
    }
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <toto.h>
    #include <cstring>
     
    char * Toto::mystrdup(char const *str)
    {
    	char * ret = new char[std::strlen(str) + 1];
    	std::strcpy(ret, str);
    	return ret;
    }
     
    //Constructeur
    Toto::Toto(void)
    {
    	nom = mystrdup("Toto");
    	nbYeux = 2;
    	nbBras = 2;
    	nbJambes = 2;
    	nbCheveux = 0;
    }
     
    //Constructeur par copie
    Toto::Toto(Toto const & instance)
    {
    	nom = mystrdup(instance.nom);
    	nbYeux = instance.nbYeux;
    	nbBras = instance.nbBras;
    	nbJambes = instance.nbJambes;
    	nbCheveux = instances.nbCheveux;
    }
     
    //Destructeur
    Toto::~Toto(void)
    {
    	delete[] nom;
    }
     
    //Opérateur d'affectation: Utilise l'idiome copy-and-swap
    Toto & Toto::operator= (Toto tmp)
    {
    	tmp.Swap(*this);
    	return *this;
    }
     
    void Toto::Swap(Toto & instance)
    {
    	std::swap(nom, instance.nom); //On échange juste les pointeurs
    	std::swap(nbYeux, instance.nbYeux);
    	std::swap(nbBras instance.nbBras);
    	std::swap(nbJambes, instance.nbJambes);
    	std::swap(nbCheveux, instance.nbCheveux);
    }
    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.

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Effectivement,
    désolé,
    j'ai retiré mon code pour éviter toute erreur
    merci

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 94
    Par défaut
    Ok, merci pour ce renseignement, je le mettrai en oeuvre dans la semaine prochaine, en attendant je ne clos pas ce post, s'il n'y a pas d'opposition...

    Merci encore !

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Encore juste un détail, il faut faire attention si tu as des descendants de ta classe. En effet, tu risques de ne pas recopier tous les attributs de l'instance mais uniquement ceux de la classe du pointeur (de niveau supérieur).

    Voici deux points de départ à lire (en anglais):

    http://www.parashift.com/c++-faq-lit....html#faq-22.5
    http://en.wikipedia.org/wiki/Cloning_(programming) (en anglais, regarder aussi l'exemple de "slicing")

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 94
    Par défaut
    Ok, merci, en bref je voulais recopier facilement tout l'objet sans avoir à reprendre tous les objets de la classe mais si on y réfléchi bien c'est un moyen efficace, et c'est simple (logique)

    Merci, merci

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

Discussions similaires

  1. copie de pointeur
    Par alaninho dans le forum C++
    Réponses: 5
    Dernier message: 07/11/2012, 23h33
  2. [Toutes versions] Copie objet d'une base externe vers une autre base externe
    Par guen dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/10/2009, 10h35
  3. Réponses: 5
    Dernier message: 26/07/2009, 16h36
  4. Copy de pointeur
    Par Hitomi_Kay dans le forum Langage
    Réponses: 7
    Dernier message: 15/05/2009, 15h30
  5. Réponses: 8
    Dernier message: 26/08/2004, 18h59

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