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 : 52

    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 : 40
    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