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 

Deriver d'un conteneur de la STL
Goto page 1, 2, 3, 4, 5, 6, 7, 8  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Aurélien REGAT-BARREL
Guest





PostPosted: Thu Jan 20, 2005 4:57 pm    Post subject: Deriver d'un conteneur de la STL Reply with quote



Bonjour,
J'aimerais bien créer quelques classes qui dérivent de certains conteneurs
de la STL. Je sais que ces derniers ne sont pas conçus pour être dérivés,
mais sachant que le but est simplement de :
- créer un vrai nouveau type au lieu d'un typedef
- ne pas ajouter de donnée membre mais uniquement dfes fonctions

est-ce une pratique acceptable ?

Exemple:

class SortedData : public std::set<int>
{
public:
SortedData( const std::vector<int> & Vect )
{
this->insert( Vect.begin(), Vect.end() );
}

// calcule la moyenne
double Average() const
{
int total = 0;
total = std::accumulate( this->begin(), this->end(), total );
return total * 1.0 / this->size();
}
};


--
Aurélien REGAT-BARREL


Back to top
Jean-Marc Bourguet
Guest





PostPosted: Thu Jan 20, 2005 5:00 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote



"Aurélien REGAT-BARREL" <nospam-aregatba (AT) yahoo (DOT) fr.invalid> writes:

Quote:
Bonjour,
J'aimerais bien créer quelques classes qui dérivent de certains conteneurs
de la STL. Je sais que ces derniers ne sont pas conçus pour être dérivés,
mais sachant que le but est simplement de :
- créer un vrai nouveau type au lieu d'un typedef
- ne pas ajouter de donnée membre mais uniquement dfes fonctions

est-ce une pratique acceptable ?

Tant que tu n'essaies pas de detruire un type derive a partir d'un
pointeur sur le type de base, il n'y a pas de probleme de C++. Pour
le reste, il faut connaitre la situation.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
noone@nowhere.com
Guest





PostPosted: Thu Jan 20, 2005 5:06 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote




Quote:
est-ce une pratique acceptable ?

Je me pose également cette question...

Je fais actuellement autre chose et je me demande si c'est à faire...

En fait je mets ma liste comme membre privé de ma classe et je fournis
des interfaces qui donnent accès à ma liste...

Je me dis que ma méthode n'est pas clair... et que c'est même plutôt
moche, non ?

En plus si je veux parcourir ma liste de l'extérieur je suis obligé de
fournir les itérateurs begin et end en public

Que pensent les gourous de ça ?

Back to top
Aurélien REGAT-BARREL
Guest





PostPosted: Thu Jan 20, 2005 5:11 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Quote:
Tant que tu n'essaies pas de detruire un type derive a partir d'un
pointeur sur le type de base, il n'y a pas de probleme de C++. Pour
le reste, il faut connaitre la situation.

A priori non, donc je vais faire ça alors.
Sinon juste pour info, si je n'ai aucune donnée membre et aucun destructeur,
ça poserait quand même un problème de détruire depuis un pointeur de base ?
Merci.

--
Aurélien REGAT-BARREL



Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Jan 20, 2005 5:26 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

On Thu, 20 Jan 2005 18:06:27 +0100, "noone (AT) nowhere (DOT) com"
<noone (AT) nowhere (DOT) com>:

Quote:
En plus si je veux parcourir ma liste de l'extérieur

Mais as-tu une bonne raison de le faire ?


--
;-)

Back to top
Arnaud Debaene
Guest





PostPosted: Thu Jan 20, 2005 6:45 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Aurélien REGAT-BARREL wrote:
Quote:
Tant que tu n'essaies pas de detruire un type derive a partir d'un
pointeur sur le type de base, il n'y a pas de probleme de C++. Pour
le reste, il faut connaitre la situation.

A priori non, donc je vais faire ça alors.
Sinon juste pour info, si je n'ai aucune donnée membre et aucun
destructeur, ça poserait quand même un problème de détruire depuis un
pointeur de base ?
Oui, car le compilateur va générer un destructeur par défaut non virtuel,

donc le problème demeurera.

Arnaud



Back to top
noone@nowhere.com
Guest





PostPosted: Thu Jan 20, 2005 6:59 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Fabien LE LEZ a écrit :
Quote:
On Thu, 20 Jan 2005 18:06:27 +0100, "noone (AT) nowhere (DOT) com"
[email]noone (AT) nowhere (DOT) com[/email]>:


En plus si je veux parcourir ma liste de l'extérieur


Mais as-tu une bonne raison de le faire ?



Oui c'est un programme d'électrostatique

http://s.cls.free.fr/index.php?page=fieldE

J'ai une classe "Charge" qui décrit des charges électrostatique
J'ai une classe "Charges" qui est une "collection" de toutes les charges.
Depuis mon programme principal il faut je j'affiche chaque charge...
Donc il faut parcourir "Charges" depuis l'extérieur...

C'est sûrement pas comme ça qu'il faut faire... mais bon !

D'ailleurs tant que j'y pense si des gourous du C++ pouvaient y jeter un
oeil pour me suggérer des modifs, suggestions (je pense surtout aux
bonnes pratiques du C++ que je n'ai pas... car je ne l'ai jamais
apprises...)

Back to top
Falk Tannhäuser
Guest





PostPosted: Thu Jan 20, 2005 7:16 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Aurélien REGAT-BARREL wrote:
Quote:
class SortedData : public std::set<int
{
public:
SortedData( const std::vector {
this->insert( Vect.begin(), Vect.end() );
}

// calcule la moyenne
double Average() const
{
int total = 0;
total = std::accumulate( this->begin(), this->end(), total );
return total * 1.0 / this->size();
}
};

Pourquoi Average() doit-elle absolument être une fonction
membre ? Quelque chose comme

template<typename Container>
double Average(Container const& c)
{
return std::accumulate(c.begin(), c.end(),
static_cast<typename Container::value_type>(0))
/ double(c.size());
}

ne fait-elle pas l'affaire ?

Falk

Back to top
Alexandre
Guest





PostPosted: Thu Jan 20, 2005 7:30 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

bonjour,

Quote:
En fait je mets ma liste comme membre privé de ma classe et je fournis des
interfaces qui donnent accès à ma liste...

tu pourrais aussi hériter en mode privé de la liste. N'étant pas un gourou,
je suis incapable de te dire si c'est mieux ou moins bien, moi je fais ça
assez souvent. Mais à priori je dirais que ça ne change pas grand chose.

Quote:

Je me dis que ma méthode n'est pas clair... et que c'est même plutôt
moche, non ?

En plus si je veux parcourir ma liste de l'extérieur je suis obligé de
fournir les itérateurs begin et end en public

Que pensent les gourous de ça ?



Back to top
Olivier Azeau
Guest





PostPosted: Thu Jan 20, 2005 7:41 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Arnaud Debaene wrote:
Quote:
Aurélien REGAT-BARREL wrote:

Tant que tu n'essaies pas de detruire un type derive a partir d'un
pointeur sur le type de base, il n'y a pas de probleme de C++. Pour
le reste, il faut connaitre la situation.

A priori non, donc je vais faire ça alors.
Sinon juste pour info, si je n'ai aucune donnée membre et aucun
destructeur, ça poserait quand même un problème de détruire depuis un
pointeur de base ?

Oui, car le compilateur va générer un destructeur par défaut non virtuel,
donc le problème demeurera.

Si l'héritage est limité à un héritage d'implémentation comme dans
l'exemple de code posté, le plus simple est quand même de faire un
héritage privé qui évite de se poser ce genre de questions.

Back to top
Olivier Azeau
Guest





PostPosted: Thu Jan 20, 2005 7:52 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Falk Tannhäuser wrote:
Quote:
Aurélien REGAT-BARREL wrote:

class SortedData : public std::set<int
{
public:
SortedData( const std::vector {
this->insert( Vect.begin(), Vect.end() );
}

// calcule la moyenne
double Average() const
{
int total = 0;
total = std::accumulate( this->begin(), this->end(), total );
return total * 1.0 / this->size();
}
};


Pourquoi Average() doit-elle absolument être une fonction
membre ? Quelque chose comme

template<typename Container
double Average(Container const& c)
{
return std::accumulate(c.begin(), c.end(),
static_cast / double(c.size());
}

ne fait-elle pas l'affaire ?

En rajoutant probablement dans la classe un
friend double Average<SortedData>(SortedData const& c);

Il s'agit avant tout de savoir si SortedData veut être visible de
l'extérieur comme un std::set<int> (héritage de type) ou si c'est juste
un héritage d'implémentation.
L'héritage de type sur des container stl étant source de problèmes, il
vaut probablement mieux opter pour un héritage privé.

Back to top
Aurelien REGAT-BARREL
Guest





PostPosted: Thu Jan 20, 2005 11:20 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Quote:
J'ai une classe "Charge" qui décrit des charges électrostatique
J'ai une classe "Charges" qui est une "collection" de toutes les charges.
Depuis mon programme principal il faut je j'affiche chaque charge...
Donc il faut parcourir "Charges" depuis l'extérieur...

typedef std::list<Charge> Charges;

ça suffit pas ?

--
Aurélien REGAT-BARREL



Back to top
Aurelien REGAT-BARREL
Guest





PostPosted: Thu Jan 20, 2005 11:22 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Quote:
Oui, car le compilateur va générer un destructeur par défaut non virtuel,
donc le problème demeurera.

Oui mais vu que ce destructeur ne fait rien où est le problème ?

--
Aurélien REGAT-BARREL



Back to top
Aurelien REGAT-BARREL
Guest





PostPosted: Thu Jan 20, 2005 11:26 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Quote:
Si l'héritage est limité à un héritage d'implémentation comme dans
l'exemple de code posté, le plus simple est quand même de faire un
héritage privé qui évite de se poser ce genre de questions.

J'y ai pensé. Mais je pense avoir au moins besoin de begin() et end(), de
l'itérateur (+ const_iterator), dans le cas de vector de at() et operator[],
....
J'ai pas envie de m'embêter à ajouter des using au fur et à mesure que j'ai
besoin d'un truc...

--
Aurélien REGAT-BARREL



Back to top
Aurelien REGAT-BARREL
Guest





PostPosted: Thu Jan 20, 2005 11:43 pm    Post subject: Re: Deriver d'un conteneur de la STL Reply with quote

Quote:
Pourquoi Average() doit-elle absolument être une fonction
membre ?

Parce que là c'était un exemple. Les fonctions que je compte mettre sont
hyper spécifiques à l'utilisation que je fais du conteneur. Comme le dit
Olivier son utilisation relève du détail d'implémentation et l'héritage
mériterait d'être protégé / privé, mais je compte le laisser public par
commodité (bénéficier simplement de begin(), end(), iterator, at(),
operator[], size(), ...).
L'idée est aussi de rendre le truc un peu plus objet et de regrouper dans un
même fichier les opérations portant sur cette utilisation particulière d'un
conteneur.
Exemple simple: j'ai déjà des fonctions dans le style de ce que tu as donné
(fonctions plus ou moins "libres" situées quelque part) et un simple typedef
dans ce style:

typdef std::set<int> SortedData;

double Special1( SortedData const & );
double Special2( SortedData const & );
double Special3( SortedData const & );

Donc déjà on verrait bien ces fonctions comme membres de SortedData. Mais
aussi par exemple SortedData ne doit pas être vide, et donc partout où je le
reçois en paramètre je suis obligé de faire des assertion() comme quoi il
est pas vide. En créant un constructeur dans le style de celui que j'ai
donné je peux m'assurer qu'il n'est jamais vide, et l'itérer sans risque...
Ca rejoint ma volonté de "conversion au RAII" comme quoi un objet créé avec
succès doit être utilisable sans devoir tester s'il se trouve dans un état
valide ou non.

--
Aurélien REGAT-BARREL



Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3, 4, 5, 6, 7, 8  Next
Page 1 of 8

 
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.