IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Construction d'un element dynamique dans une classe.


Sujet :

C++

  1. #1
    Membre �prouv�
    Inscrit en
    Novembre 2006
    Messages
    1 073
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par d�faut 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 : S�lectionner tout - Visualiser dans une fen�tre � part
    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 : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    C::~C()
    {	delete elem;  }
    J'ai enfin une derni�re question. Pourquoi ne faut il pas faire ceci:


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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.

  2. #2
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Il manque le destructeur virtuel dans A : http://cpp.developpez.com/faq/cpp/?p...UCTEUR_virtuel

    elem = &B(4,chaine);
    Cr�e un objet temporaire de type B, non nomm�, avec comme param�tres du constructeur 4 et chaine. On prend ensuite l'adresse de cet objet que l'on stocke dans elem. Puis cet objet temporaire est d�truit, et donc elem pointe sur de la m�moire qui a �t� d�sallou�e...
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  3. #3
    Membre �prouv�
    Inscrit en
    Novembre 2006
    Messages
    1 073
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par d�faut
    ok merci pour ta r�ponse.
    En tout cas, il n'y a rien de dangereux ou de choquant a faire une telle impl�mentation?

  4. #4
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Par d�faut
    Citation Envoy� par deubelte Voir le message
    En tout cas, il n'y a rien de dangereux ou de choquant a faire une telle impl�mentation?
    Le risque c'est de cr�er un C qui dont l'elem pointe sur un A et d'invoquer get. Remplace ton cast C par un dynamic cast et teste la valeur de retour.

  5. #5
    Membre �prouv�
    Inscrit en
    Novembre 2006
    Messages
    1 073
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par d�faut
    Le risque c'est de cr�er un C qui dont l'elem pointe sur un A et d'invoquer get. Remplace ton cast C par un dynamic cast et teste la valeur de retour.
    oui, ok d'une mani�re g�n�rale, j'ai tendance a privil�gier les static cast sur les dynamiques, pour des raisons de perf.

  6. #6
    Membre �prouv�
    Inscrit en
    Novembre 2006
    Messages
    1 073
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par d�faut
    J'ai un autre probl�me. La classe que j'ai faite est un peu simpliste.
    En r�alit�, dans la classe C nous avons quelque chose de ce style:
    (la classe A et B reste inchang�e).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    template<typename T>
    class MaClasse{
    public:
    	MaClasse<T>(double x1,double x2,double x3):a(x1),b(x2),c(x3){};
    private:
    	double a; 
    	double c;
    	double b;
    };
     
    class C{
    public:
    	C(int i,char*);
    	char* getChar(){
    			return	((B*)elem)->getunChar();
    	}
    private:
    MaClasse<A>* elem;
    };
     
    C::C(int u,char* chaine){
     
    	if(u==1)
    	{
    	   elem = new MaClasse<A>(1,2,3);
    	}
    	else
    	{
    	  elem = new MaClasse<B>(1);
    	}
    }
    cela ne fonctionne pas car le C++ voit deux objets compl�tement diff�rents, l'un de type MaClasse<A>*, l'autre de type MaClasse<B>* qu'il ne peut pas convertir bien que A soit la classe m�re de B.

    Alors comment puis-je faire, pour avoir ceci:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    	if(u==1)
    	{
    //Instanciation d'un objet de type MaClasse<A>	, dans mon code, cela marche parfaitement. 
    	}
    	else
    	{
    //Instanciation d'un objet de type MaClasse<B>. C'est là que ca plante !!
    	}
    Je ne vois pas trop comment contourner le probl�me du template qui met en �chec tout ce que j'ai fait avant. Peut etre une classe-interface sup�rieure � A.

    Je vous remercie.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    Tu peux utiliser une classe abstraite dont le template h�rite publiquement, et utiliser un pointeur vers ce type abstrait.

  8. #8
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Par d�faut
    Citation Envoy� par deubelte Voir le message
    oui, ok d'une mani�re g�n�rale, j'ai tendance a privil�gier les static cast sur les dynamiques, pour des raisons de perf.
    Un cast C n'est pas un static_cast<>.
    (Re)lis KNUTH : les optimisations pr�matur�es sont la racine de tous les maux.

Discussions similaires

  1. [D�butant] Assigner le travail d'un BackgroundWorker dynamiquement dans une classe.
    Par BasicZX81 dans le forum VB.NET
    R�ponses: 14
    Dernier message: 04/02/2014, 19h39
  2. Attributs dynamiques dans une classe
    Par ratapapa dans le forum Langage
    R�ponses: 2
    Dernier message: 16/12/2009, 17h16
  3. R�ponses: 10
    Dernier message: 24/09/2009, 18h49
  4. R�ponses: 1
    Dernier message: 19/07/2007, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo