C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Recopier un vecteur de pointeurs

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Pierre THIERRY
Guest





PostPosted: Mon May 02, 2005 2:28 pm    Post subject: Recopier un vecteur de pointeurs Reply with quote



Bonjour à tous,

j'ai un vecteur de pointeurs sur des instances de dérivées d'une même
classe de base

vector<Foo*> vec1;

Ce qui me permet d'utiliser une fonction virtuelle de la classe Foo

vector<Foo*>::iterator it;
....
(*it)->bar();

Et j'aimerais faire une copie vec2 de ce vec1, dont les pointeurs
pointeraient sur des copies des objets pointés dans vec1. Si je fais une
simple compie de vec1, je me retrouve avec des objets pointés deux fois,
d'où risque de modification et, pire, d'utilisation de delete plusieurs
fois.

Je ne vois pas du tout comment réaliser une copie de l'objet pointé. Si
je le déréférence pour créer un objet, il faudra bien que je donne
explicitement un type, donc celui de la classe de base, et je perds ses
caractéristiques

Foo *new_ptr = Foo(*(*it))

Quelqu'un a déjà rencontré ça, ou voit comment ce serait possible ?

Laborieusement,
Nowhere man

--
[email]nowhere.man (AT) levallois (DOT) eu.org[/email]
OpenPGP 0xD9D50D8A

Back to top
Rémy
Guest





PostPosted: Mon May 02, 2005 2:35 pm    Post subject: Re: Recopier un vecteur de pointeurs Reply with quote




"Pierre THIERRY" <nowhere.man (AT) levallois (DOT) eu.org> a écrit dans le message de
news: [email]pan.2005.05.02.14.28.33.769785 (AT) levallois (DOT) eu.org[/email]...
Quote:
Bonjour à tous,

j'ai un vecteur de pointeurs sur des instances de dérivées d'une même
classe de base

vector<Foo*> vec1;

Ce qui me permet d'utiliser une fonction virtuelle de la classe Foo

vector<Foo*>::iterator it;
...
(*it)->bar();

Et j'aimerais faire une copie vec2 de ce vec1, dont les pointeurs
pointeraient sur des copies des objets pointés dans vec1. Si je fais une
simple compie de vec1, je me retrouve avec des objets pointés deux fois,
d'où risque de modification et, pire, d'utilisation de delete plusieurs
fois.

Je ne vois pas du tout comment réaliser une copie de l'objet pointé. Si
je le déréférence pour créer un objet, il faudra bien que je donne
explicitement un type, donc celui de la classe de base, et je perds ses
caractéristiques

Foo *new_ptr = Foo(*(*it))

Quelqu'un a déjà rencontré ça, ou voit comment ce serait possible ?

Laborieusement,
Nowhere man

--
[email]nowhere.man (AT) levallois (DOT) eu.org[/email]
OpenPGP 0xD9D50D8A


Bonjour,

Une solution est d'implémenter dans chaque classe une méthode (virtuelle)
Clone qui fait une copie de l'objet courant (elle connait la classe).

La copie de chaque objet se fait par
Foo *new_ptr = it->Clone();

Rémy



Back to top
Pierre THIERRY
Guest





PostPosted: Mon May 02, 2005 4:23 pm    Post subject: Re: Recopier un vecteur de pointeurs Reply with quote



Le Mon, 02 May 2005 16:35:48 +0200, Rémy a écrit :
Quote:
Une solution est d'implémenter dans chaque classe une méthode
(virtuelle) Clone qui fait une copie de l'objet courant (elle connait
la classe).

J'y ai également pensé après avoir posté mon article, en me baladant
(c'est pour éviter de perdre ce genre d'idées que j'ai un dictaphone
numérique Wink )... Pour l'instant, c'est la seule solution qui me
vienne, mais je trouve ça insatisfaisant.

Ce qui est con, c'est que clone se résumé à ça :

virtual Classe* clone() const { return new Classe(*this); }

C'est-à-dire qu'il faudrait simplement une sorte de template
automatique...

Dubitativement,
Nowhere man
--
[email]nowhere.man (AT) levallois (DOT) eu.org[/email]
OpenPGP 0xD9D50D8A


Back to top
Michel Michaud
Guest





PostPosted: Mon May 02, 2005 8:31 pm    Post subject: Re: Recopier un vecteur de pointeurs Reply with quote

Dans le message [email]pan.2005.05.02.16.23.34.120982 (AT) levallois (DOT) eu.org[/email],
Pierre THIERRY <nowhere.man (AT) levallois (DOT) eu.org> a écrit :
Quote:
Ce qui est con, c'est que clone se résumé à ça :

virtual Classe* clone() const { return new Classe(*this); }

C'est-à-dire qu'il faudrait simplement une sorte de template
automatique...

Recherche les articles « Copie de classe dérivée » au début d'avril.

--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/




Back to top
Pierre THIERRY
Guest





PostPosted: Mon May 02, 2005 11:37 pm    Post subject: Re: Recopier un vecteur de pointeurs Reply with quote

Le Mon, 02 May 2005 16:31:55 -0400, Michel Michaud a écrit :
Quote:
Recherche les articles « Copie de classe dérivée » au début d'avril.

Je vais voir ça.

Pour l'instant, je m'en tire avec ceci dans  :

class Base {
template<class T> T* clone() const
{
return new T(*this);
}
virtual Base* clone() const;
}

Et je n'ai plus qu'à mettre le prototype dans les dérivées, ce qui me
satisfait, finalement (ce qui me faisait chier, c'est de réécrire X fois
la même fonction, ça me démange) :

class Derivee {
virtual Derivee* clone() const;
}

Brièvement,
Nowhere man
--
[email]nowhere.man (AT) levallois (DOT) eu.org[/email]
OpenPGP 0xD9D50D8A


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Tue May 03, 2005 10:03 am    Post subject: Re: Recopier un vecteur de pointeurs Reply with quote

Pierre THIERRY wrote:
Quote:
Le Mon, 02 May 2005 16:31:55 -0400, Michel Michaud a écrit :
Recherche les articles « Copie de classe dérivée » au début
d'avril.

Je vais voir ça.

Pour l'instant, je m'en tire avec ceci dans :

class Base {
template<class T> T* clone() const
{
return new T(*this);
}
virtual Base* clone() const;
}

Et je n'ai plus qu'à mettre le prototype dans les dérivées, ce
qui me satisfait, finalement (ce qui me faisait chier, c'est
de réécrire X fois la même fonction, ça me démange) :

class Derivee {
virtual Derivee* clone() const;
}

Et ça marche comment ?

Moi, j'réécris la fonction. Elle n'est pas longue ; je le trouve
moins fastidieux à le réécrire que de dériver d'une classe
template supplémentaire. Ceci dit, c'est facile à oublier. C'est
pour ça qu'en général, la fonction publique dans la classe de
base ne serait pas virtuelle, mais ressemblerait à :

Base* Base::clone() const
{
Base* result = doClone() ;
assert( typeid( *result ) == typeid( *this ) ) ;
return result ;
}

Avec une fonction virtuelle privée doClone() qui fait le new.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Pierre THIERRY
Guest





PostPosted: Tue May 03, 2005 10:20 am    Post subject: Re: Recopier un vecteur de pointeurs Reply with quote

Le Tue, 03 May 2005 01:37:53 +0200, Pierre THIERRY a écrit :
Quote:
Pour l'instant, je m'en tire avec ceci dans  :

class Base {
template<class T> T* clone() const
{
return new T(*this);
}
virtual Base* clone() const;
}

Et je n'ai plus qu'à mettre le prototype dans les dérivées,

J'ai crié victoire trop tôt : ça compile bien, mais ça foire
lamentablement à l'édition des liens... :-/

Pour l'instant, j'ai donc X fois la même définition, à la main. Celui
qui trouve un moyen vraiment élégant aura ma reconnaissance éternelle.

Manuellement,
Nowhere man
--
[email]nowhere.man (AT) levallois (DOT) eu.org[/email]
OpenPGP 0xD9D50D8A


Back to top
Pierre THIERRY
Guest





PostPosted: Tue May 03, 2005 10:22 am    Post subject: Re: Recopier un vecteur de pointeurs Reply with quote

Le Tue, 03 May 2005 03:03:22 -0700, kanze a écrit :
Quote:
Et ça marche comment ?

Mal. Cf. mon autre post. :-/

Quote:
Base* Base::clone() const
{
Base* result = doClone() ;
assert( typeid( *result ) == typeid( *this ) ) ;
return result ;
}

Je pense que je vais rajouter quelque chose comme ça, mais plutôt avec
une exception qu'un assert.

Exeptionnellement,
Nowhere man
--
[email]nowhere.man (AT) levallois (DOT) eu.org[/email]
OpenPGP 0xD9D50D8A


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.