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

Heritage : appel de fonctions membre de classe parent

1 réponse
Avatar
PurL
Bonjour,

Je veux manipuler des types de données
j'ai des classes décrivant chaque type de donnée
class CCalcul
{
...
};

class CVariable
{
...
};

Dans mon programme je veux manipuler des listes des différents types.
Comme ces manipulations sont communes (ajouter, supprimer, libelle, ...)
j'ai écrit une classe parent :

template <class type>
class CList
{
public:
Ajouter (type objet);
NbObjet(); //methode permettant de connaitre le nombre d'objets
présent dans la liste
...
};

et je créé des classes enfants dérivant de cette classe :

class CListCalculs : public CList<CCalcul>
{
};

class CListVariables : public CList<CVariable>
{
};

et les objets correspondants :
CListCalculs *listCalculs = new CListCaculs;
CListVariables *listVariables = new CListVariables;

Ensuite j'utilise une liste de pointeurs contenant les objets listVariables,
listCalculs (je présente mon code avec deux types : calcul et variable mais
je peux en avoir une dizaines).
Donc ma_liste[0] pointe sur listVariables et ma_liste[1] pointe sur
listCalculs.

Mon probleme :
J'aimerais accéder à la fonction NbObjets de ma classe parent comme ceci :

for (int i = 0; i < nbtype; i++) qqch = ma_liste[i]->NbObjets();

le pb c'est que le compilateur ne connait plus le type des pointeurs stockés
dans ma_liste donc ne peut pas appeler la méthode NbObjets :(
de plus je ne peux pas transtyper avec CList puisqu'on a à faire à une
classe template...

Comment puis-je m'en sortir ?

Merci pour votre aide,

PurL.

1 réponse

Avatar
Benoit Rousseau
PurL wrote:
Bonjour,

Je veux manipuler des types de données
j'ai des classes décrivant chaque type de donnée
class CCalcul
class CVariable

Dans mon programme je veux manipuler des listes des différents types.
template <class type> class CList
tu n'as pas pensé à utilise std::list ?



et je créé des classes enfants dérivant de cette classe :

class CListCalculs : public CList<CCalcul>
class CListVariables : public CList<CVariable>

et les objets correspondants :
CListCalculs *listCalculs = new CListCaculs;
CListVariables *listVariables = new CListVariables;

Ensuite j'utilise une liste de pointeurs contenant les objets listVariables,
listCalculs (je présente mon code avec deux types : calcul et variable mais
je peux en avoir une dizaines).
Donc ma_liste[0] pointe sur listVariables et ma_liste[1] pointe sur
listCalculs.
Comme tu le dis toi même, CList<CCalcul> et CList<CVariable> ne sont pas

du même type...
pense aussi à utiliser std::vector pour ton tableau

En général, on fait dériver le CCalcul et les CVariable d'un même type
CExpression et on applique un Composite Pattern.
Je suppose en effet que CCalcul sera dérivé pour faire un CAddition ?
Dans ce cas, CExpression serait ton type de base, avec une fonction
eval() virtuelle qui te retourne le resultat de l'expression.

En simplifiant, tu pourrais faire
class CAddition : public CExpression {
public: CAddition( CExpression* g, CExpression* d ) :
gauche( g ), droite( d ) {};
CVariable eval() {
return gauche->eval() + droite->eval();
//Operateur + a définir
}
protected:
CExpression* gauche;
CExpression* droite;
};

class CVariable : public CExpression {
...
CVariable eval() {
return *this;
}
};

A partir ce ca, tes CCalcul et CVariable ont le même type de base et tu
peux construire des list<CExpression*> qui sont "compatible"


--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/