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 d'objets de classe abstraites?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut Tableau d'objets de classe abstraites?
    Salut à tous!
    J'obtiens l'erreur cannot allocate an object of abstract type... dans mon programme.
    Est-ce que j'ai le droit de créer des pointeurs sur classes abstraites?
    Voici une partie de mon 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
    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
     
    //Le main
    int main()
    {
    	Employe* pauvres;
    	//Cinq* riches[3];
     
    	pauvres=new Employe;  //là je fais un test et j'obtiens l'erreur.
    /*	for(int i=0;i<3;i++)
    	{
    		pauvres[i]=new Trente("toto",2,3);
    	}
     
    	*pauvres[0]=Trente("Dupont",28,2500);
    	*pauvres[1]=Trente("Tintin",54,2000);
    	*pauvres[2]=Trente("Milou",35,2900);
    	*riches[0]=Cinq("Picsou",88,3000);
    	*riches[1]=Cinq("Flairsou",77,2300);
    	*riches[2]=Cinq("Gripsou",66,3100);
     
    	for(int i=0;i<1;i++)
    	{
     
    //		pauvres[i]->getNom();
    //		cout<<"Le pauvre "<<pauvres[i]->getNom()<<" gagne "<<pauvres[i]->getSalaire()<<" ( "<<pauvres[i]->getTarif()<<" /heure"<<endl;
    //		cout<<"Le riche "<<riches[i]->getNom()<<" gagne "<<riches[i]->getSalaire()<<" ( "<<riches[i]->getTarif()<<" /heure"<<endl;
    	}*/
    }
     
    //Un header
    class Employe{
    	protected:
    		string nom;
    		int heure;
    		int tarif;
    	public:
    		Employe();
    		Employe(string n, int h,int t);
    		Employe(Employe &e);
    		virtual int getSalaire()=0;
    		virtual void setInfoSalaire(int t,int h)=0;
    		string getNom();
    		int getTarif();
    };
    Quelqu'un pourrait-il m'aider svp?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Salut,

    La classe Employe est abstraite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Employe
    {
    //...
       virtual int getSalaire()=0;
       virtual void setInfoSalaire(int t,int h)=0;
    //..
    }
    Est-ce que j'ai le droit de créer des pointeurs sur classes abstraites?
    Il n'est pas possible d'instancier d'objet d'un type abstrait. Le pointeur peut être du type Employe, mais pas l'objet.

    Il faut implémenter les fonctions virtuelles pures soit dans cette classe, soit dans une classe dérivée.

    voir FAQ classe abstraite

  3. #3
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Citation Envoyé par BlueMonkey Voir le message
    Salut,

    Le pointeur peut être du type Employe, mais pas l'objet.
    C'est-à-dire?

  4. #4
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    Quand on décide de faire d'une classe, une classe abstraite, c'est qu'on ne souhaite pas pouvoir instancier cette classe, c'est-à-dire avoir des objets du type de cette classe.

    Par exemple, on cherche souvent à représenter des concepts réels sous forme de classe, souvent il y a des concepts qui restent trop globaux et n'ont pas de sens réel physique. On donne souvent l'exemple des Formes :
    un carré, un losange, un triangle et un cercles sont tous des formes. Pourtant on ne souhaitera pas manipuler juste un objet du type Forme, qui n'a pas de réel sens, une forme sera un carré, un losange, etc, un hexagone, ... Du coup, Forme sera une classe abstraite.

    Pour qu'une classe soit abstraite en C++, il suffit qu'elle ait une méthode virutelle pure qui devra être (re)définie dans une des classes dérivées.
    Exemple : ma classe Forme suivante est abstraite

    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
     
    class Forme
    {
    public:
    virtual void dessine() = 0; // Ceci est une méthode virtuelle pure (virtuelle = virtual / pure car "=0")
    };
     
    class Triangle : public Forme
    {
    public:
    void dessine() { ... } // Ici tu définis et donnes un corps à dessine(), Si Triangle n'a pas d'autres membres virtuels purs, alors tu peux l'instancier.
    };
     
    int main()
    {
       Forme f = Forme() // Ici tu obtiens une erreur car tu ne peux pas instancier un objet de type Forme car c'est une classe abstraite.
     
       Triangle t = Triangle(); // Ok
     
       Forme *f = new Triangle() // Ok, tu peux aussi avoir un pointeur sur un type abstrait, la classe de base de ta hiérarchie de classe.
     
       return 0;
    }

  5. #5
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Je m'inspire de ton code, mais j'obtiens des erreurs, toujours au niveau du main().
    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
     
    //ma classe mère
    class Employe{
    	protected:
    		string nom;
    		int heure;
    		int tarif;
    	public:
    		Employe();
    		Employe(string n, int h,int t);
    		Employe(Employe &e);
    		virtual int getSalaire()=0;
    		virtual void setInfoSalaire(int t,int h)=0;
    		string getNom();
    		int getTarif();
    };
    //une classe fille
    class Trente:public Employe
    {
    	public:
    		Trente();
    		Trente(string n, int h, int t);
    		Trente(Trente& t);
    		int getSalaire();
    		void setInfoSalaire(int t, int h);
    };
     
    int main()
    {
    	Trente pauvres= Trente(); //Là j'obtiens l'erreur
    }
    L'erreur est la suivante: no matching function for call to ‘Trente::Trente(Trente)’
    ...

  6. #6
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    Avant de s'inspirer, il vaut mieux comprendre. Que cherches-tu vraiment à faire?
    Quelle sera ta hiérarchie de classe finale?

    Ensuite dans ton code, où sont les corps des membres?

    Dans ta classe Trente, tu as 3 constructeurs, les 2 premiers peuvent être facilement regroupés en un seul en utilisant des arguments par défaut.
    Quant au 3ème, le constructeur de copie, pourquoi le déclares-tu, celui généré par défaut ne te suffit pas?

    Ensuite dans ta classe de base, il serait bien de qualifier le destructeur de virtuel.

    Avant d'entrer et d'explorer tous ces détails, qu'aimerais tu faire?

    Car il y a beaucoup de choses à dire sur ton code donc mieux vaut orienter la discussion suivant ce que tu souhaites faire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tableau et classe abstraite
    Par NFHnv dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 18/03/2009, 15h28
  2. Réponses: 7
    Dernier message: 22/10/2008, 10h14
  3. le .class d'un tableau d'objet dynamique
    Par Invité dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 11/07/2008, 10h29
  4. Tableau et classes abstraites
    Par HNoury dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 02/06/2007, 19h49
  5. [POO] Tableau d'objets B dans une instance de class A
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2006, 09h52

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