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

héritage ou nouvelle classe?

46 réponses
Avatar
Zoubidaman
Bonsoir,

j'ai une classe Possessions:

class Possessions
{
private:
//Le début et la fin d'une pause
typedef pair<int,int> Pauses;

//La liste des pauses
typedef vector<Pauses> ListePauses;
typedef ListePauses::iterator ite_Pauses;
ListePauses LP;

int __fastcall DureePause();
public:
int DebutPossession,FinPossession;
AnsiString ActiondeFin;
TColor CouleurActiondeFin;

Possessions();

Possessions(
int DebutPossession,
int FinPossession,
const ListePauses & VecteurPauses,
AnsiString ActiondeFin,
TColor CouleurActiondeFin)
:
DebutPossession(DebutPossession),
FinPossession(FinPossession),
LP(VecteurPauses),
ActiondeFin(ActiondeFin),
CouleurActiondeFin(CouleurActiondeFin)
{}

const ListePauses & AccesListePauses() const { return this->LP; }

int __fastcall DureePossession();
};

J'ai besoin d'une classe Strategies, qui ait la même partie private, mais
avec la partie publique différente, car j'ai besoin de moins de
variables...

Comme je ne connais (pour l'instant) rien à l'héritage, je voulais savoir
si j'avais besoin de passer par là, ou bien s'il fallait que je crée une
nouvelle classe...

Merci d'avance...

10 réponses

1 2 3 4 5
Avatar
Zoubidaman
Ah oui, j'ai aussi besoin de ces deux fonctions publiques:

int __fastcall Possessions::DureePossession()
{
int Duree = FinPossession - DebutPossession - DureePause();

return Duree;
}

et

const ListePauses & AccesListePauses() const { return this->LP; }

Le problème étant que pour DureePossession, les variables FinPossession et
DebutPossession seront remplacées par FinStrategie et DebutStrategie...

Voilà!
Avatar
Fabien LE LEZ
On 11 Aug 2003 22:46:24 GMT, Zoubidaman
wrote:

J'ai besoin d'une classe Strategies, qui ait la même partie private, mais
avec la partie publique différente, car j'ai besoin de moins de
variables...


Dans ce cas, tu as deux choix :
1/ Faire dériver tes deux classes d'une même classe de base
(héritage).
2/ Mettre toutes les données privées dans une classe, et mettre
cette classe comme membre de chacun de tes deux classes (composition).

Le choix est sémantique : si tu trouves une classe "Base" telle que le
fait que tout objet de classe "Possessions" (ou "Strategies")est un
objet de classe "Base" ait un sens, alors tu peux choisir l'héritage.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Zoubidaman
Fabien LE LEZ wrote in
news::

On 11 Aug 2003 22:46:24 GMT, Zoubidaman
wrote:

J'ai besoin d'une classe Strategies, qui ait la même partie private,
mais avec la partie publique différente, car j'ai besoin de moins de
variables...


Dans ce cas, tu as deux choix :
1/ Faire dériver tes deux classes d'une même classe de base
(héritage).
2/ Mettre toutes les données privées dans une classe, et mettre
cette classe comme membre de chacun de tes deux classes (composition).

Le choix est sémantique : si tu trouves une classe "Base" telle que le
fait que tout objet de classe "Possessions" (ou "Strategies")est un
objet de classe "Base" ait un sens, alors tu peux choisir l'héritage.




Je n'ai pas compris la notion de composition.

Néanmoins j'ai tenté de faire avec l'héritage, et j'en suis là:

class Base
{
private:
//Le début et la fin d'une pause
typedef pair<int,int> Pauses;

//La liste des pauses
typedef vector<Pauses> ListePauses;
typedef ListePauses::iterator ite_Pauses;
ListePauses LP;

int __fastcall DureePause();
};

class Possessions : Base
{
public:
int DebutPossession,FinPossession;
AnsiString ActiondeFin;
TColor CouleurActiondeFin;

Possessions();

Possessions(
int DebutPossession,
int FinPossession,
const ListePauses & VecteurPauses,
AnsiString ActiondeFin,
TColor CouleurActiondeFin)
:
DebutPossession(DebutPossession),
FinPossession(FinPossession),
LP(VecteurPauses),
ActiondeFin(ActiondeFin),
CouleurActiondeFin(CouleurActiondeFin)
{}

const ListePauses & AccesListePauses() const { return this->LP; }

int __fastcall DureePossession();
};

Et à la compilation, il me met une erreur à LP(VecteurPauses)...

J'imagine que c'est normal vu que c'est dans le constructeur, mais je ne
sais pas comment éviter cela...

Message d'erreur de Builder:

'Base::LP' n'est pas une classe de base non ambiguë de 'Possessions'

Un constructeur de classe C++ tente d'appeler ce constructeur de classe
de base.
Cette erreur se produit également si vous tentez de modifier les droits
d'accès de 'class::constructor.'
Vérifiez vos déclarations.


Avatar
Zoubidaman
"Christophe Lephay" wrote in
news:bh9c3h$8fv$:

"Zoubidaman" a écrit dans le message de
news:
Fabien LE LEZ wrote in
news::

On 11 Aug 2003 22:46:24 GMT, Zoubidaman
wrote:

J'ai besoin d'une classe Strategies, qui ait la même partie
private, mais avec la partie publique différente, car j'ai besoin
de moins de variables...


Dans ce cas, tu as deux choix :
1/ Faire dériver tes deux classes d'une même classe de base
(héritage).
2/ Mettre toutes les données privées dans une classe, et
mettre
cette classe comme membre de chacun de tes deux classes
(composition).

Le choix est sémantique : si tu trouves une classe "Base" telle que
le fait que tout objet de classe "Possessions" (ou "Strategies")est
un objet de classe "Base" ait un sens, alors tu peux choisir
l'héritage.




Je n'ai pas compris la notion de composition.


Par exemple :

class A
{
int a, b;
public:
fonctionA();
};

class B
{
int a, b;
public:
fonctionB();
};

devient :

struct etat
{
int a, b;
};

class A
{
etat etatA;
public:
fonctionA();
};

class B
{
etat etatB;
public:
fonctionB();
};

Je n'ai qu'un seul regret dans ce cas précis, c'est que A et B
n'héritent pas d'une classe mère qui contiendrait l'état, parce que
sinon je l'aurais appelé etatMere.

Mais bon, je m'en remettrai ;)

Chris




LOL, excellent :D

Bon, comme j'ai peur de faire une bétise, je vais vous demander de me
guider:

Voilà mes deux classes:

class Possessions
{
private:
//Le début et la fin d'une pause
typedef pair<int,int> Pauses;

//La liste des pauses
typedef vector<Pauses> ListePauses;
typedef ListePauses::iterator ite_Pauses;
ListePauses LP;

int __fastcall DureePause();
public:
int DebutPossession,FinPossession;
AnsiString ActiondeFin;
TColor CouleurActiondeFin;

Possessions();

Possessions(
int DebutPossession,
int FinPossession,
const ListePauses & VecteurPauses,
AnsiString ActiondeFin,
TColor CouleurActiondeFin)
:
DebutPossession(DebutPossession),
FinPossession(FinPossession),
LP(VecteurPauses),
ActiondeFin(ActiondeFin),
CouleurActiondeFin(CouleurActiondeFin)
{}

const ListePauses & AccesListePauses() const { return this->LP; }

int __fastcall DureePossession();
};

class Strategies
{
private:
//Le début et la fin d'une pause
typedef pair<int,int> Pauses;

//La liste des pauses
typedef vector<Pauses> ListePauses;
typedef ListePauses::iterator ite_Pauses;
ListePauses LP;

int __fastcall DureePause();
public:
int DebutStrategie,FinStrategie;

Strategies();

Strategies(
int DebutStrategie,
int FinStrategie,
const ListePauses & VecteurPauses)
:
DebutStrategie(DebutStrategie),
FinStrategie(FinStrategie),
LP(VecteurPauses)
{}

const ListePauses & AccesListePauses() const { return this->LP; }

int __fastcall DureeStrategie();
};

J'ajouterai que DureeStrategie et DureePossession sont exactement les
mêmes fonctions (ne différant que par les noms de variables...)

int __fastcall Strategies::DureeStrategie()
{
return FinStrategie - DebutStrategie - DureePause();
}

Donc dans mon cas, composition ou héritage?




Avatar
Fabien LE LEZ
On 12 Aug 2003 00:01:25 GMT, Zoubidaman
wrote:

int DebutPossession,FinPossession;


Un conseil : évite de mettre des majuscules à tes variables, vu que tu
en mets déjà à tes types et à tes fonctions -- on a du mal à s'y
retrouver et ça rend la lecture plus difficile.

class MaClasse
{
int ma_variable;
void MaFonction();
};

Tu peux choisir d'autres conventions, mais l'important est de
différencier au premier coup d'oeil un type d'une variable...


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Fabien LE LEZ
On 12 Aug 2003 00:54:41 GMT, Zoubidaman
wrote:

Donc dans mon cas, composition ou héritage?


C'est difficile à dire sans en savoir plus. En particulier : qu'est-ce
qu'un objet "Strategies" représente ? Idem pour "Possessions".
Deux classes de forme très proche peuvent n'avoir aucun lien de
parenté, si leurs significations sont très différentes.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Fabien LE LEZ
On 12 Aug 2003 00:54:41 GMT, Zoubidaman
wrote:

Possessions(
int DebutPossession,
int FinPossession,
const ListePauses & VecteurPauses,
AnsiString ActiondeFin,
TColor CouleurActiondeFin)
:
DebutPossession(DebutPossession),
FinPossession(FinPossession),


Ceci ne fonctionnera vraisemblablement pas comme tu t'y attends.
D'une manière générale, désigner deux objets différents par le même
nom est une très mauvaise idée.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Fabien LE LEZ
On 12 Aug 2003 00:54:41 GMT, Zoubidaman
wrote:

Donc dans mon cas, composition ou héritage?


On peut déjà commencer par mettre de l'ordre dans tout ça :

struct Intervalle
{
int debut;
int fin;
double Duree() { return fin - debut; }
};

class GestionPauses
{
public:
typedef Intervalle Pause; /* Au singulier : un Intervalle == une
Pause */
typedef std::vector<Pauses> ListePauses;
typedef ListePauses::const_iterator const_iterator;
int DureeTotale() const;
// Rajouter ici constructeurs et push_back()...
private:
ListePauses liste;
};

int CalculeDuree (Intervalle const& intervalle_general,
GestionPauses const& pauses);

class Possessions
{
private:
GestionPauses pauses;

public:
Intervalle debut_et_fin;

AnsiString ActiondeFin;
TColor CouleurActiondeFin;

Possessions();

Possessions(
Intervalle const& debut_et_fin,
GestionPauses const&,
AnsiString const& ActiondeFin,
TColor const& CouleurActiondeFin);

GestionPauses const & AccesListePauses() const
{ return pauses; }

int DureePossession()
{ return CalculeDuree (debut_et_fin, pauses); }
};

int CalculeDuree (Intervalle const& intervalle_general,
GestionPauses const& pauses)
{
return intervalle_general.Duree() - pauses.DureeTotale();
}




--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Christophe Lephay
"Zoubidaman" a écrit dans le message de
news:
class Possessions
{
private:
//Le début et la fin d'une pause
typedef pair<int,int> Pauses;

//La liste des pauses
typedef vector<Pauses> ListePauses;
typedef ListePauses::iterator ite_Pauses;
ListePauses LP;

int __fastcall DureePause();
public:
int DebutPossession,FinPossession;
AnsiString ActiondeFin;
TColor CouleurActiondeFin;

Possessions();

Possessions(
int DebutPossession,
int FinPossession,
const ListePauses & VecteurPauses,
AnsiString ActiondeFin,
TColor CouleurActiondeFin)
:
DebutPossession(DebutPossession),
FinPossession(FinPossession),
LP(VecteurPauses),
ActiondeFin(ActiondeFin),
CouleurActiondeFin(CouleurActiondeFin)
{}

const ListePauses & AccesListePauses() const { return this->LP; }

int __fastcall DureePossession();
};

class Strategies
{
private:
//Le début et la fin d'une pause
typedef pair<int,int> Pauses;

//La liste des pauses
typedef vector<Pauses> ListePauses;
typedef ListePauses::iterator ite_Pauses;
ListePauses LP;

int __fastcall DureePause();
public:
int DebutStrategie,FinStrategie;

Strategies();

Strategies(
int DebutStrategie,
int FinStrategie,
const ListePauses & VecteurPauses)
:
DebutStrategie(DebutStrategie),
FinStrategie(FinStrategie),
LP(VecteurPauses)
{}

const ListePauses & AccesListePauses() const { return this->LP; }

int __fastcall DureeStrategie();
};

J'ajouterai que DureeStrategie et DureePossession sont exactement les
mêmes fonctions (ne différant que par les noms de variables...)

int __fastcall Strategies::DureeStrategie()
{
return FinStrategie - DebutStrategie - DureePause();
}

Donc dans mon cas, composition ou héritage?


Clairement la composition sur la base d'une classe Pause. En plus d'y
regrouper un certain nombre de fonctionnalités (pas juste des données,
donc), tu pourras en profiter pour simplifier tes constructeurs en leur
fournissant un paramètre de type Pause au lieu de ta longue liste de
trucs...

Chris

Avatar
Zoubidaman
Tu peux choisir d'autres conventions, mais l'important est de
différencier au premier coup d'oeil un type d'une variable...


Je vais essayer de faire attention

1 2 3 4 5