Construction d'un element dynamique dans une classe.
Bonjour
Dans le cas d'un dev professionnel, je dois réaliser la conception suivante.
Nous avons une classe A de base, et une classe dérivée B.
Nous avons enfin une classe C, qui possède un attribut qui peut etre de type A ou de type B selon la valeur d'un paramètre.
Alors voila ce que j'ai fait. Toutes les critiques sont pour moi bonnes a prendre.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class A{
public:
A(int u):a(u){};
A(){};
private:
int a;
};
class B:public A{
public:
B(int x1,char* x2):A(x1),x(x2){};
char* getunChar(){
return x;
}
private:
char* x;
};
class C{
public:
C(int i,char*);
char* getChar(){
return ((B*)elem)->getunChar();
}
private:
A* elem;
};
C::C(int u,char* chaine){
if(u==1)
{
elem =new A(1);
}
else
{
elem = new B(4,chaine);
}
}
int main(){
char *x="ee";
C unobjet(2,x);
std::cout<<unobjet.getChar();
} |
La classe B hérite bien de A. La classe C possède en attribut un pointeur A. Mais ce pointeur peut avoir pour type dynamique le type B. La valeur du paramètre est passé dans le constructeur. Il s'agit dans ce cas u. Si u vaut 1 alors elem est de type A, sinon il est de type B. D'un point de vue théorique, cela me semble bien.
Il faudrat bien sur dans le destructeur faire un delete de elem, ce que j'ai fait ici:
Code:
1 2
| C::~C()
{ delete elem; } |
J'ai enfin une dernière question. Pourquoi ne faut il pas faire ceci:
Code:
1 2 3 4 5 6 7 8 9 10
| C::C(int u,char* chaine){
if(u==1)
{
elem =&A(1);
}
else
{
elem = &B(4,chaine);
}
} |
Je vous rermercie pour votre aide.