Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Héritage d'une variable de classe

3 réponses
Avatar
maestric777
Pb : J'ai une classe mère avec une variable de classe et deux classes
filles héritant de cette classe mère. Je pensais que chaque classe
fille aurait sa propre variable de classe indépendante. Eh bien non,
les 3 classes (mère et classes filles) se partagent la même variable.
Il semble qu'en Java c'est pareil.

Contexte : 3 classes avec chacune une variable de classe. Les 3
classes ont des traitements communs agissant sur leur variable de
classe. Je voudrais simplement les regrouper.

Quelles solutions existe-t-il ?

3 réponses

Avatar
Jean-Marc Bourguet
(Jerome Jaglale) writes:

Contexte : 3 classes avec chacune une variable de
classe. Les 3 classes ont des traitements communs agissant
sur leur variable de classe. Je voudrais simplement les
regrouper.


Je suppose que ce que tu appelles variables de classe est un
membre statique.

Quelles solutions existe-t-il ?


Tu encapsules ces traitements dans une classe template dont
tu hérites. Le paramètre template étant la classe qui doit
avoir le membre statique.

Exemple:

template <typename T>
class IntanceCounter
{
public:
InstanceCounter() { ++ourCounter; }
~InstanceCounter() { ourCounter--; }

void foo() { }
static int getCount() { return ourCounter; }
private:
static int ourCounter;
};

template <typename T> int InstanceCounter<T>::ourCounter = 0;

class Base: public InstanceCounter<Base> {
...
};

class Derived: public Base, public InstanceCounter<Derived> {
...
};

Remarques:
* Base::getCount() retourne le nombre d'instances de Base
et de Derived (parce que Derived herite de Base et donc
de InstanceCounter<Base>. C'est volontaire ici pour
montrer que les effets des constructeurs et destructeurs
peuvent surprendre.

* Derived::getCount() pose un problème: il y en a deux.
Solutions:
- utiliser InstanceCounter<Derived>::getCount();
- ajouter
using InstanceCounter<Derived>::getCount;
dans la zone publique de Derived.

* Ce problème existe existe aussi pour foo. Outre la
solution avec using, on peut faire:
d.InstanceCounter<Derived>::foo()
Pour accéder au foo de la partie base de d,
d.Base::foo()

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

Avatar
kanze
Jean-Marc Bourguet wrote in message
news:...
(Jerome Jaglale) writes:

Contexte : 3 classes avec chacune une variable de classe. Les 3
classes ont des traitements communs agissant sur leur variable de
classe. Je voudrais simplement les regrouper.


Je suppose que ce que tu appelles variables de classe est un membre
statique.

Quelles solutions existe-t-il ?


Tu encapsules ces traitements dans une classe template dont tu
hérites.


Pourquoi hériter, et non simplement contenir ?

--
James Kanze GABI Software http://www.gabi-soft.fr
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


Avatar
Jean-Marc Bourguet
writes:

Jean-Marc Bourguet wrote in message
news:...
(Jerome Jaglale) writes:

Contexte : 3 classes avec chacune une variable de classe. Les 3
classes ont des traitements communs agissant sur leur variable de
classe. Je voudrais simplement les regrouper.


Je suppose que ce que tu appelles variables de classe est un membre
statique.

Quelles solutions existe-t-il ?


Tu encapsules ces traitements dans une classe template dont tu
hérites.


Pourquoi hériter, et non simplement contenir ?


Excellente question. Une partie de la reponse tient en ce que je ne
me la suis pas posee.

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