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 :

[C++][H�ritage][Agr�gation]


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Par d�faut [C++][H�ritage][Agr�gation]
    Bonjour,
    J'ai un probl�me pour faire un agr�gation d'un h�ritage d'une classe abstraite... je la refais en plus imag�:
    Je poss�de une classe A qui a une relation d'agr�gation avec une classe B, abstraite.

    J'ai un certain nombre de classes filles (C, D, E F...) h�rit�es de B. Maintenant, je voudrais pouvoir, dans A, cr�er une methode du style AddClasseB( B*,x,y) qui me permettrais d'ajouter n'importe quel objet C, D, E.. Mais je vois pas comment faire...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A{
     
    public:
     
    void AddClassB(B* Obj, int x, int y);
     
    private :
     
    B** tabB;
    };
    J'ai red�fini l'op�rateur �gal de la classe M�re et des classes filles, mais �a me sert � rien...

    Est-ce que c'est possible ce que je veux faire??
    Merci d'avance pour vos r�ponses,

  2. #2
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par d�faut
    Tout d'abord, l'objet B dans ta classe A n'est pas une relation d'agr�gation mais de composition car � la destruction de ton instance de A, l'objet B ne sera pas d�truit car c'est un pointeur.
    Ensuite, il me semble pas que tu puisses stocker dans tabB un tableau d'�l�ments diff�rents h�rit�s de B car les instances de tes classes C,D, E, ... filles de B n'auront pas forc�ment la m�me taille. Donc naviguer avec un pointeur sur des blocs de taille diff�rente va se r�v�ler tr�s dur.

  3. #3
    Membre �m�rite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    D�tails du profil
    Informations personnelles :
    �ge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par d�faut
    Tu veux une matrice de classe B, c'est bien �a? Et utiliser le polymorphisme, tu dois alors d�clarer TabB comme suit:
    Le polymorphisme implique d'avoir un pointeur sur la classe de base.
    Si X repr�sente les lignes et Y les colonnes:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    void AddClassB(B* Obj, int x, int y) {
      TabB[y][x] = Obj;
    }

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Par d�faut Oups
    Pardon j'ai mal expliqu� ma fonction, je veux juste ajouter un objet, pas une matrice de classe, donc c'est bien:
    �� j'en suis s�r, mais effectivement le probl�me est dans :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void AddClassB(B* Obj) { 
    int i;  
    TabB[i] = Obj; 
    }
    Ca fait appel � l'op�rateur �gal de B, et moi je voudrais pouvoir affecter dans le tableau un objet C, D, E...h�rit� de B! Et je pense pas que �e soit possible, Dites moi que si!!

  5. #5
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut Re: [C++][H�ritage][Agr�gation]
    Ca fait appel � l'op�rateur �gal de B, et moi je voudrais pouvoir affecter dans le tableau un objet C, D, E...h�rit� de B! Et je pense pas que �e soit possible, Dites moi que si!!
    Tu n'affectes pas un B, mais un B*. Donc pas d'appel � un quelconque op�rateur =, ce qui est tout � fait logique avec une telle s�mantique. Donc qu'est-ce qui ne marche pas ? Ton code est correct pour l'instant. (pense quand m�me � std::vector et aux pointeurs intelligents -- voir la FAQ C++).

    Tout d'abord, l'objet B dans ta classe A n'est pas une relation d'agr�gation mais de composition car � la destruction de ton instance de A, l'objet B ne sera pas d�truit car c'est un pointeur.
    Ca c'est un d�tail d'impl�mentation, rien n'emp�che de lier la dur�e de vie d'un objet � son contenant, qu'il soit allou� dynamiquement ou non. C'�tait juste pour pinailler.

  6. #6
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Salut,

    Pour repondre a ta question ce que tu veux faire est possible. Maintenant si ca ne marche pas c que tu as une erreure quelquepart.
    Comment as tu allouer la memoire de tabB ?


    XXiemeciel

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Par d�faut
    Tu n'affectes pas un B, mais un B*. Donc pas d'appel � un quelconque op�rateur =, ce qui est tout � fait logique avec une telle s�mantique. Donc qu'est-ce qui ne marche pas ? Ton code est correct pour l'instant.
    Ok, merci pour la r�ponse, je pense que j'ai des gros probl�mes d'initialisation et de destruction c'est ce qui fait planter...


    Comment as tu allouer la memoire de tabB ?
    C'est �a mon probl�me, j'alloue dans le constructeur de la classe A:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    _tabB= new B*[_nbPattern];
    Ensuite je voudrais instancier chaque B*, ce qui est impossible avec une classe abstraite, donc je pense que je vais laisser tomber mes m�thodes virtuelles pures.. et faire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    _tabB= new B*[_nbPattern];
     for (int i =0 ; i<_nbB; i++)
     {
    	_tabB[i]=new B();
     }
    Autre petit probl�me, quand on fait de l'h�ritage, que se passe t'il lorsqu'on appelle le destructeur d'une classe fille, �a fait d'abord appel au destructeur de la classe m�re? mes probl�mes pourraient aussi venir de la...
    En tout cas merci pour vos r�ponses!

  8. #8
    Membre �m�rite

    Homme Profil pro
    �tudiant
    Inscrit en
    Mars 2005
    Messages
    634
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par d�faut
    Citation Envoy� par flaharrague
    Autre petit probl�me, quand on fait de l'h�ritage, que se passe t'il lorsqu'on appelle le destructeur d'une classe fille, �a fait d'abord appel au destructeur de la classe m�re? mes probl�mes pourraient aussi venir de la...
    En tout cas merci pour vos r�ponses!
    http://c.developpez.com/faq/cpp/?pag...explicite_base

  9. #9
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356
    Par d�faut
    Tout d'abord, l'objet B dans ta classe A n'est pas une relation d'agr�gation mais de composition car � la destruction de ton instance de A, l'objet B ne sera pas d�truit car c'est un pointeur.

    Ca c'est un d�tail d'impl�mentation, rien n'emp�che de lier la dur�e de vie d'un objet � son contenant, qu'il soit allou� dynamiquement ou non. C'�tait juste pour pinailler.
    Juste pour pinailler un peu plus .... Il me semble que flaharrague avait raison ... si les dur�es de vie ne sont pas li�es, c'est de l'aggr�gation. La composition refl�te un embarquement : le contenu est cr�� et d�truit avec le contenant.

    C'est tout
    (je crois que tout a d�j� �t� dit, mais pense vraiment � utiliser la STL, �a va te simplifier la vie... enfin, le code surtout )

    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
    #include <vector>
     
    class Test
    {
    public:
     
    	void AddClassB( B* Obj )
    	{
    		m_tabB.push_back(Obj);
    	}
     
    private :
     
    	std::vector<B*> m_tabB;
    };
     
     
    Test t;
    t.AddClassB( new C );
    t.AddClassB( new D );
    ...

  10. #10
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Par d�faut
    Ok merci � tous pour vos r�ponses, je vais tenter avec la STL.

  11. #11
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Salut,

    Je pense qu'une std::vector resoudrais tes problemes.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    std::vector<B*>* vec = new std::vector<B*>;

    XXiemeciel

  12. #12
    Membre chevronn�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par d�faut
    Autant �viter l'allocation dynamique du vecteur.

Discussions similaires

  1. [Postgresql]H�ritage
    Par lheureuxaurelie dans le forum PostgreSQL
    R�ponses: 13
    Dernier message: 02/10/2008, 09h18
  2. Classes, h�ritage, agr�gats
    Par zatt_ dans le forum Diagrammes de Classes
    R�ponses: 3
    Dernier message: 24/08/2006, 15h17
  3. [Postgres] H�ritage + Cl�s
    Par k-reen dans le forum PostgreSQL
    R�ponses: 6
    Dernier message: 21/05/2003, 16h37
  4. Cr�ation d'agr�gat avec SQLServer
    Par Testav dans le forum MS SQL Server
    R�ponses: 4
    Dernier message: 19/09/2002, 16h54
  5. H�ritage entre Forms
    Par BarBal dans le forum Composants VCL
    R�ponses: 7
    Dernier message: 29/08/2002, 17h44

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