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 :

tableau héritage classe abstraite


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Par défaut tableau héritage classe abstraite
    Bonjour,

    J ai 2 classes escalade et randonnée qui héritent d une classe activité abstraite.
    J ai une classe sport qui contient un tableau d activités.

    Extrait de la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Sportif : public Naturel
    {
    private:
        int _inbAct;
        Activitee *_tabAct;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sportif::Sportif() : Naturel()
    {
    _tabAct = NULL;
    _inbAct = 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Sportif::AjouterAct(const Activitee * act){
        Activitee *tab[_inbAct+1];
        for (int i = 0; i <_inbAct; i++ )
            tab[i] = _tabAct[i];
        tab[_inbAct] = act;
        delete []_tabAct;
        _tabAct = tab;
        _inbAct ++;
    }


    Dans ajouter avant de connaitre le classes abstraite, je faisais un tableau intermédiaire de taille n +1 avec l objet ajouter. Je supprimer l ancien tableau puis j échanger les pointeurs. Afin d avoir un tableau de taille variable.

    Sauf que je n y arrive pas là à faire passer un pointeur d activité en paramètre.
    Enfin je suis perdu, j ai l’impression que tab n est pas un pointeur d Activitée donc ça plante mais j ai pas le droit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Activitee *tab = new Activitee[_inbAct+1];
    car Activitee est une classe abstraite...

    Activitee

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Activite[100] déclare 100 objet Activite.
    Pour déclarer 100 pointeur sur Activite, la syntaxe c'est Activite*[100].

    Activite* est un pointeur sur Activite, peut également être utilisé comme tableau en pointant sur le premier élément d'une liste contigue dActivite.
    Pour avoir un tableau de pointeur, il faut alors déclarer Activite**. De la même manière, cette syntaxe peut autant définir un tableau sur Activite*, ou un tableau 2dimensions sur Activite.
    etc..

    Sinon, on a inventé std::vector depuis !
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Par défaut
    Okay, merci pour l aide.
    Enfet
    Activitee *tab = new Activitee[100];
    et
    Activitee **tab;
    et
    Activitee *tab[100];

    représente la même chose ?

    Merci pour l aide. Et non je ne peut pas utiliser vector dans le cadre de mon devoir.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par zeracoa Voir le message
    Activitee *tab = new Activitee[100];
    et
    Activitee **tab;
    et
    Activitee *tab[100];

    représente la même chose ?
    Absolument pas.
    Cf ce que j'ai raconté plus haut :
    - dans le premier cas tu as un tableau de Activitee
    - dans le second cas tu as un pointeur sur pointeur. Qui peut être utilisé comme tableau de pointeur ou tableau 2 dimensions.
    - dans le 3° cas tu as 100 pointeur contigüs. Que tu peux utiliser comme tableau 2 dimensions ou 100 pointeurs.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Par défaut
    Okay c est clair maintenant.

    Donc je peut pas utiliser la première solution car j ai une classe abstraite.

    Je souhaite utiliser la 3e mais j'ai une erreur de segmentation au moment d accéder à l'élément du tableaux donc il n enregistre pas le pointeur vers act dans le tableau. J ai modifié un peu le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Sportif : public Naturel
    {
    private:
        int _inbAct;
        Activitee **_tabAct;
     
    public:
        Sportif();
        Sportif(const string &);
        virtual ~Sportif();
        virtual void Affiche()const;
        friend ostream& operator<<( ostream &,const Sportif &);
        void AjouterAct( Activitee *);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sportif::Sportif() : Naturel()
    {
    _tabAct = NULL;
    _inbAct = 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Sportif::AjouterAct( Activitee * act){
        //act->Affiche();   //cela fonctionne donc *act est bon
        Activitee *tab[_inbAct+1];
        for (int i = 0; i <_inbAct; i++ )
            tab[i] = _tabAct[i];
        tab[_inbAct] = act;
        delete []_tabAct;
        _tabAct = tab;
        _inbAct ++;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Sportif::Affiche()const{
        cout << "******************************** " << endl
             << "   Information sur le lieux " << endl
             << "******************************** " << endl
             << "Nom du lieux : " << _sNom << endl
             << "******************************** " << endl
             << "   Information sur les activités " << endl
             << "******************************** " << endl;
        for(int i = 0; i < _inbAct; i++) // c est ici que çà bug
            _tabAct[i]->Affiche();
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Pour allouer un tableau, il faut utiliser l'opérateur new[].
    Il est impossible de définir un tableau comme tu le fais Activitee *tab[_inbAct+1];. (En fait ça a été possible fut un temps en C mais ce n'est pas le sujet).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. héritage classes abstraites
    Par seroa dans le forum Langage
    Réponses: 4
    Dernier message: 12/10/2009, 14h31
  2. héritage, classe abstraite
    Par sebatlante dans le forum C++
    Réponses: 4
    Dernier message: 14/08/2009, 13h13
  3. héritage - classes abstraites
    Par Invité dans le forum C++
    Réponses: 2
    Dernier message: 03/05/2009, 12h17
  4. Tableau et classe abstraite
    Par NFHnv dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 18/03/2009, 15h28
  5. Tableau et classes abstraites
    Par HNoury dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 02/06/2007, 19h49

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