OVH Cloud OVH Cloud

list de classe

3 réponses
Avatar
Gaetan
bonjour
J'ai un petit probleme avec un code C++ g=E9rant une liste d'objet:

j'ai :

class CParent
{
public:
CParent();
~CParent();
=2E...
}

class CObj1 : public CParent
{
public:
CObj1();
~CObj1();
=2E..
}

class CObj2 : public CParent
{
public:
CObj2();
~CObj2();
=2E..
}

class CObj3 : public CParent
{
public:
CObj3();
~CObj3();
=2E..
}

j'aimerais faire une liste qui regroupe CObj1, CObj2 et CObj3.
J'ai donc:
vector<parent*> m_objects;

pour ajouter je fais:
CObj *obj1 =3D new CObj1;
m_objects.push_back(obj);
=2E..
CObj *obj3 =3D new CObj3;
m_objects.push_back(obj);

la classe parent sert d'interface, elle comprends toutes les m=E9thodes=20
(abstraites) pour dialoguer avec les fils (obj).

Mon probleme est =E0 la destruction de cette liste.
Comme ce sont des pointeurs, il faut que j'appelle moi m=EAme le destruct=
eur:
for(vector<CParent*>::const_iterator itor =3D m_objects.begin();
itor !=3D m_objects.end();
++itor)
{
delete (*itor);
}
Mon probleme est donc le suivant: avec cette m=E9thode seul le destructeu=
r=20
de CParent est appel=E9, et pas celui de CObj1 si l'=E9l=E9ment est un CO=
bj1*,...

je suppose qu'en faisant une bidouille du genre
delelte (CObj1*) (*itor);
en fonction du type de l'objet, =E7a fonctionnerais.
Je pourrais stocker le type sous fourme d'un entier accessible via une=20
m=E9thode abstraite de la classe parente, mais je trouve =E7a un peu...=20
horrible.

Est-ce que vous pouvez me dire o=F9 j'ai p=EAcher, et surtout s'il y a un=
=20
autre moyen pour avoir une liste d'object de type diff=E9rent, mais=20
partageant la m=EAme interface.

merci

--=20

~~ Gaetan ~~
http://www.xeberon.net

3 réponses

Avatar
Patrick Mézard
"Gaetan" a écrit dans le message de
news:bivv3g$vgv$
J'ai un petit probleme avec un code C++ gérant une liste d'objet:

j'ai :

class CParent
{
public:
CParent();
~CParent();
....
}



[snip]

Est-ce que vous pouvez me dire où j'ai pêcher, et surtout s'il y a un
autre moyen pour avoir une liste d'object de type différent, mais
partageant la même interface.


Tes destructeurs doivent être virtuels.

class CParent
{
public:
CParent();
virtual ~CParent();
....
}

class CObj1 : public CParent
{
public:
CObj1();
virtual ~CObj1(); //encore que là le virtual est optionel, le destructeur
est sans doute virtuel par défaut si celui de la classe père l'est.
...
}

Après ça, delete sur un pointeur de type CParent* appellera le bon
destructeur suivant l'objet réellement pointé.

Patrick Mézard

Avatar
Gaetan
Patrick Mézard wrote:

Est-ce que vous pouvez me dire où j'ai pêcher, et surtout s'il y a un
autre moyen pour avoir une liste d'object de type différent, mais
partageant la même interface.



Tes destructeurs doivent être virtuels.

class CParent
{
public:
CParent();
virtual ~CParent();
.....
}

class CObj1 : public CParent
{
public:
CObj1();
virtual ~CObj1(); //encore que là le virtual est optionel, le dest ructeur
est sans doute virtuel par défaut si celui de la classe père l'est.
....
}

Après ça, delete sur un pointeur de type CParent* appellera le bon
destructeur suivant l'objet réellement pointé.

Patrick Mézard




En effet, j'avais oublier que les destructeurs peuvent être virtual
(mais pas les constructeurs)
Merci beaucoup!!

--

~~ Gaetan ~~
http://www.xeberon.net


Avatar
Michaël Cortex
Patrick Mézard wrote:
class CParent
{
public:
CParent();
~CParent();
....
}



[snip]

Est-ce que vous pouvez me dire où j'ai pêcher, et surtout s'il y a un
autre moyen pour avoir une liste d'object de type différent, mais
partageant la même interface.


Tes destructeurs doivent être virtuels.

class CParent
{
public:
CParent();
virtual ~CParent();
....
}

class CObj1 : public CParent
{
public:
CObj1();
virtual ~CObj1(); //encore que là le virtual est optionel, le
destructeur est sans doute virtuel par défaut si celui de la classe
père l'est. ...
}

Après ça, delete sur un pointeur de type CParent* appellera le bon
destructeur suivant l'objet réellement pointé.


Je dirais "les" constructeurs... Le destructeur de la classe CParent est
aussi appelé dans ce cas-là (c'est bien ça ?).
--
<=- Michaël "Cortex" Monerau -=>