Mettez-vous trois sections "private:" différentes, toujours dans le
même ordre ?
Question subsidiaire : spécifiez-vous le "virtual" même quand il est
implicite (comme pour B::f()) ?
Mettez-vous trois sections "private:" différentes, toujours dans le
même ordre ?
Question subsidiaire : spécifiez-vous le "virtual" même quand il est
implicite (comme pour B::f()) ?
Mettez-vous trois sections "private:" différentes, toujours dans le
même ordre ?
Question subsidiaire : spécifiez-vous le "virtual" même quand il est
implicite (comme pour B::f()) ?
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Exemple :
class B
{
private:
virtual void f()= 0;
};
class D: public B
{
private:
/*virtual*/ void f(); // Fonction qui vient de B.
void g(); // Fonction spécifique à D.
int une_variable_membre;
virtual void h(); // Fonction que les classes héritant de D.
};
J'aimerais savoir comment vous faites pour distinguer
visuellement ces différent types de membres privés.
Mettez-vous trois sections "private:" différentes, toujours
dans le même ordre ?
Y a-t-il d'autres méthodes ?
Question subsidiaire : spécifiez-vous le "virtual" même quand
il est implicite (comme pour B::f()) ?
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Exemple :
class B
{
private:
virtual void f()= 0;
};
class D: public B
{
private:
/*virtual*/ void f(); // Fonction qui vient de B.
void g(); // Fonction spécifique à D.
int une_variable_membre;
virtual void h(); // Fonction que les classes héritant de D.
};
J'aimerais savoir comment vous faites pour distinguer
visuellement ces différent types de membres privés.
Mettez-vous trois sections "private:" différentes, toujours
dans le même ordre ?
Y a-t-il d'autres méthodes ?
Question subsidiaire : spécifiez-vous le "virtual" même quand
il est implicite (comme pour B::f()) ?
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Exemple :
class B
{
private:
virtual void f()= 0;
};
class D: public B
{
private:
/*virtual*/ void f(); // Fonction qui vient de B.
void g(); // Fonction spécifique à D.
int une_variable_membre;
virtual void h(); // Fonction que les classes héritant de D.
};
J'aimerais savoir comment vous faites pour distinguer
visuellement ces différent types de membres privés.
Mettez-vous trois sections "private:" différentes, toujours
dans le même ordre ?
Y a-t-il d'autres méthodes ?
Question subsidiaire : spécifiez-vous le "virtual" même quand
il est implicite (comme pour B::f()) ?
Prèsque toujours pûres, d'après mon expérience.
[...]
Mais pourquoi insistes-tu sur « nouvelles » ?
- des implémentations de fonctions virtuelles d'une classe de base.
Je ne vois pas ça comme une catégorie distincte de la
précédante.
Prèsque toujours pûres, d'après mon expérience.
[...]
Mais pourquoi insistes-tu sur « nouvelles » ?
- des implémentations de fonctions virtuelles d'une classe de base.
Je ne vois pas ça comme une catégorie distincte de la
précédante.
Prèsque toujours pûres, d'après mon expérience.
[...]
Mais pourquoi insistes-tu sur « nouvelles » ?
- des implémentations de fonctions virtuelles d'une classe de base.
Je ne vois pas ça comme une catégorie distincte de la
précédante.
Bonjour,
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Bonjour,
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Bonjour,
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Moi, depuis que j'ai découvert l'idiome PIMPL (ici même d'ailleurs), je mets
toutes mes données liées uniquement à l'implémentation dans un pimpl, et
tout le reste en protected.
Moi, depuis que j'ai découvert l'idiome PIMPL (ici même d'ailleurs), je mets
toutes mes données liées uniquement à l'implémentation dans un pimpl, et
tout le reste en protected.
Moi, depuis que j'ai découvert l'idiome PIMPL (ici même d'ailleurs), je mets
toutes mes données liées uniquement à l'implémentation dans un pimpl, et
tout le reste en protected.
On Fri, 28 Apr 2006 21:21:09 +0200, Hamiral :Moi, depuis que j'ai découvert l'idiome PIMPL (ici même d'ailleurs), je
mets toutes mes données liées uniquement à l'implémentation dans un pimpl,
et tout le reste en protected.
Groumpf ?
Pimpl est un idiome certes très utile, mais relativement lourd, qu'on
ne doit donc utiliser que quand on en a besoin.
Et quand on a des hiérarchies de classes avec des fonctions virtuelles
en veux-tu en voilà, ça risque d'être assez pénible à gérer.
Quant à mettre "tout le reste en protected", j'ai du mal à voir ce que
tu veux dire.
Là encore, "protected" est utile, mais d'utilisation tout de même
assez limitée. Généralement, une section "protected:" contient assez
peu de fonctions (et aucune variable).
On Fri, 28 Apr 2006 21:21:09 +0200, Hamiral <hamiral@hamham.fr>:
Moi, depuis que j'ai découvert l'idiome PIMPL (ici même d'ailleurs), je
mets toutes mes données liées uniquement à l'implémentation dans un pimpl,
et tout le reste en protected.
Groumpf ?
Pimpl est un idiome certes très utile, mais relativement lourd, qu'on
ne doit donc utiliser que quand on en a besoin.
Et quand on a des hiérarchies de classes avec des fonctions virtuelles
en veux-tu en voilà, ça risque d'être assez pénible à gérer.
Quant à mettre "tout le reste en protected", j'ai du mal à voir ce que
tu veux dire.
Là encore, "protected" est utile, mais d'utilisation tout de même
assez limitée. Généralement, une section "protected:" contient assez
peu de fonctions (et aucune variable).
On Fri, 28 Apr 2006 21:21:09 +0200, Hamiral :Moi, depuis que j'ai découvert l'idiome PIMPL (ici même d'ailleurs), je
mets toutes mes données liées uniquement à l'implémentation dans un pimpl,
et tout le reste en protected.
Groumpf ?
Pimpl est un idiome certes très utile, mais relativement lourd, qu'on
ne doit donc utiliser que quand on en a besoin.
Et quand on a des hiérarchies de classes avec des fonctions virtuelles
en veux-tu en voilà, ça risque d'être assez pénible à gérer.
Quant à mettre "tout le reste en protected", j'ai du mal à voir ce que
tu veux dire.
Là encore, "protected" est utile, mais d'utilisation tout de même
assez limitée. Généralement, une section "protected:" contient assez
peu de fonctions (et aucune variable).
Quant à tout ce que je mets en protected, c'est toutes les données et
méthodes qui ont un sens par rapport à ce que représente la classe
Quant à tout ce que je mets en protected, c'est toutes les données et
méthodes qui ont un sens par rapport à ce que représente la classe
Quant à tout ce que je mets en protected, c'est toutes les données et
méthodes qui ont un sens par rapport à ce que représente la classe
Fabien LE LEZ wrote:
Question subsidiaire : spécifiez-vous le "virtual" même quand
il est implicite (comme pour B::f()) ?
Je crois qu'il y a différents points de vue. Était-ce Valentin
(quelqu'un sait ce qu'il devient ?) qui disait utiliser cette
solution :
class A {
virtual void f();
};
class B : public A {
override void f();
};
avec une définition de override qui pouvait être soit :
#define override
soit
#define override virtual
Le problème est que si l'on met virtuel, on peut rendre
virtuel une fonction qui ne l'était pas et cacher la fonction
non virtuelle de départ. Ne rien mettre, en revanche,
demandait de connaître la classe mère pour savoir si la
fonction était ou non virtuelle.
Mettre "override" permettait de signaler qu'on voulait
redéfinir une fonction sans pour autant introduire d'effet de
bord.
L'intérêt de changer la définition de rien à virtual
permettait aussi de détecter des erreurs : si le comportement
du programme change en changeant la définition de override,
c'est qu'on a fait une erreur sur la virtualité des
fonctions...
J'avais trouvé cela convainquant à l'époque et l'ai adopté
pour mon propre code.
Fabien LE LEZ wrote:
Question subsidiaire : spécifiez-vous le "virtual" même quand
il est implicite (comme pour B::f()) ?
Je crois qu'il y a différents points de vue. Était-ce Valentin
(quelqu'un sait ce qu'il devient ?) qui disait utiliser cette
solution :
class A {
virtual void f();
};
class B : public A {
override void f();
};
avec une définition de override qui pouvait être soit :
#define override
soit
#define override virtual
Le problème est que si l'on met virtuel, on peut rendre
virtuel une fonction qui ne l'était pas et cacher la fonction
non virtuelle de départ. Ne rien mettre, en revanche,
demandait de connaître la classe mère pour savoir si la
fonction était ou non virtuelle.
Mettre "override" permettait de signaler qu'on voulait
redéfinir une fonction sans pour autant introduire d'effet de
bord.
L'intérêt de changer la définition de rien à virtual
permettait aussi de détecter des erreurs : si le comportement
du programme change en changeant la définition de override,
c'est qu'on a fait une erreur sur la virtualité des
fonctions...
J'avais trouvé cela convainquant à l'époque et l'ai adopté
pour mon propre code.
Fabien LE LEZ wrote:
Question subsidiaire : spécifiez-vous le "virtual" même quand
il est implicite (comme pour B::f()) ?
Je crois qu'il y a différents points de vue. Était-ce Valentin
(quelqu'un sait ce qu'il devient ?) qui disait utiliser cette
solution :
class A {
virtual void f();
};
class B : public A {
override void f();
};
avec une définition de override qui pouvait être soit :
#define override
soit
#define override virtual
Le problème est que si l'on met virtuel, on peut rendre
virtuel une fonction qui ne l'était pas et cacher la fonction
non virtuelle de départ. Ne rien mettre, en revanche,
demandait de connaître la classe mère pour savoir si la
fonction était ou non virtuelle.
Mettre "override" permettait de signaler qu'on voulait
redéfinir une fonction sans pour autant introduire d'effet de
bord.
L'intérêt de changer la définition de rien à virtual
permettait aussi de détecter des erreurs : si le comportement
du programme change en changeant la définition de override,
c'est qu'on a fait une erreur sur la virtualité des
fonctions...
J'avais trouvé cela convainquant à l'époque et l'ai adopté
pour mon propre code.
On 28 Apr 2006 00:24:29 -0700, "kanze" :
- des implémentations de fonctions virtuelles d'une classe de base.
Je ne vois pas ça comme une catégorie distincte de la
précédante.
Ben... C'est exactement l'inverse.
La catégorie précédente ajoute du boulot pour les classes
dérivées ; cette catégorie en enlève.
Typiquement, j'ai souvent un truc de ce genre :
class B
{
virtual int f (int)= 0;
};
class D: public B
{
virtual int g (int)= 0;
virtual int f (int x) { return 2-g(4*x); }
};
class DD: public D
{
virtual int g (int);
// On laisse f(int) telle quelle, elle convient très bien.
};
On 28 Apr 2006 00:24:29 -0700, "kanze" <kanze@gabi-soft.fr>:
- des implémentations de fonctions virtuelles d'une classe de base.
Je ne vois pas ça comme une catégorie distincte de la
précédante.
Ben... C'est exactement l'inverse.
La catégorie précédente ajoute du boulot pour les classes
dérivées ; cette catégorie en enlève.
Typiquement, j'ai souvent un truc de ce genre :
class B
{
virtual int f (int)= 0;
};
class D: public B
{
virtual int g (int)= 0;
virtual int f (int x) { return 2-g(4*x); }
};
class DD: public D
{
virtual int g (int);
// On laisse f(int) telle quelle, elle convient très bien.
};
On 28 Apr 2006 00:24:29 -0700, "kanze" :
- des implémentations de fonctions virtuelles d'une classe de base.
Je ne vois pas ça comme une catégorie distincte de la
précédante.
Ben... C'est exactement l'inverse.
La catégorie précédente ajoute du boulot pour les classes
dérivées ; cette catégorie en enlève.
Typiquement, j'ai souvent un truc de ce genre :
class B
{
virtual int f (int)= 0;
};
class D: public B
{
virtual int g (int)= 0;
virtual int f (int x) { return 2-g(4*x); }
};
class DD: public D
{
virtual int g (int);
// On laisse f(int) telle quelle, elle convient très bien.
};
Fabien LE LEZ wrote:
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Moi, depuis que j'ai découvert l'idiome PIMPL (ici même
d'ailleurs), je mets toutes mes données liées uniquement à
l'implémentation dans un pimpl, et tout le reste en protected.
Mais bon, je suis encore novice, donc ce n'est probablement
pas la meilleur chose finalement ...
Fabien LE LEZ wrote:
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Moi, depuis que j'ai découvert l'idiome PIMPL (ici même
d'ailleurs), je mets toutes mes données liées uniquement à
l'implémentation dans un pimpl, et tout le reste en protected.
Mais bon, je suis encore novice, donc ce n'est probablement
pas la meilleur chose finalement ...
Fabien LE LEZ wrote:
Dans certaines classes, j'ai trois types de membres privés :
- des membres "réellement" privés, auxquels aucune autre classe n'a
accès ;
- des déclarations de nouvelles fonctions virtuelles (éventuellement
pures) ;
- des implémentations de fonctions virtuelles d'une classe de base.
Moi, depuis que j'ai découvert l'idiome PIMPL (ici même
d'ailleurs), je mets toutes mes données liées uniquement à
l'implémentation dans un pimpl, et tout le reste en protected.
Mais bon, je suis encore novice, donc ce n'est probablement
pas la meilleur chose finalement ...