 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Aurélien REGAT-BARREL Guest
|
Posted: Thu Jan 20, 2005 4:57 pm Post subject: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 5:00 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
"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
|
Posted: Thu Jan 20, 2005 5:06 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
| 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
|
Posted: Thu Jan 20, 2005 5:11 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
| 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
|
Posted: Thu Jan 20, 2005 5:26 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 6:45 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 6:59 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 7:16 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 7:30 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 7:41 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 7:52 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
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
|
Posted: Thu Jan 20, 2005 11:20 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
| 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
|
Posted: Thu Jan 20, 2005 11:22 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
| 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
|
Posted: Thu Jan 20, 2005 11:26 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
| 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
|
Posted: Thu Jan 20, 2005 11:43 pm Post subject: Re: Deriver d'un conteneur de la STL |
|
|
| 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 |
|
 |
|
|
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
|
|