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 :

Instancier une classe avec un tableau ?


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Points : 17
    Points
    17
    Par défaut Instancier une classe avec un tableau ?
    Bonjour à tous,

    j'ai cherché un peu partout sans trouver de réponse... pourtant je pense
    que mon problème n'a rien d'exceptionnel !

    J'essaye tout simplement d'instancier une classe a l'aide d'un tableau
    (pour éviter d'avoir à écrire un nouveau nom pour chaque objet créé).

    Ainsi plutôt que d'avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Animal
    {
           // Methodes et attributs
    }
     
    int main()
    {
    Animal un_animal;
    Animal un_autre_animal;
    }

    j'aimerais avoir :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Animal
    {
           // Methodes et attributs
    }
     
    int main()
    {
    Animal ensemble_des_animaux[20]; // creation d'un tableau de type 'Animal'
     
    Animal ensemble_des_animaux[0]; // instanciation de la classe 'Animal' dans la première case du tableau
    Animal ensemble_des_animaux[1];
    // ...
    }

    Est-ce possible ?
    Je vous remercie d'avance (et j'en profite pour m'excuser si la question a déjà été posée x fois avant...)

    Bonne journée,

    Actuenligne

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,
    je pense que tu pourrais essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Animal
    {
           // Methodes et attributs
    }
     
    int main()
    {
        Animal ensemble_des_animaux[20]; // creation d'un tableau de type 'Animal'
        Animal ensemble_des_animaux[0],setvalue(...);
        Animal ensemble_des_animaux[1],setvalue(...);
    // ...
    }
    Le truc serai de prevoir des parametres par defaut pour ton constructeur de la classe <Animal>. Et (probablement) des "Setters".
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Merci pour l'idée !
    Je me doutais que j'avais un problème de syntaxe.
    Mais le programme plante quand j'essaye. En fait je ne connais pas les "Setters" et leur utilisation...

  4. #4
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Comme la dit afranck64, la règle de base lorsque que l'on souhaite créer un tableau d'objet et que la classe qui définit les objets possède un constructeur par défaut (c'est à dire qui ne prend aucun paramétre). C'est nécessaire pour pouvoir allouer correctement le tableau.

    Ensuite il faut que tu définisses (ce que afranck64 appelle des setters) une ou plusieurs méthodes qui te permettent de définir les valeurs des attributs de ta classes.

    Une fois ces deux points réglés, après avoir alloué ton tableau, il ne reste plus qu'à boucler dessus et appeller la ou les méthode qui te permettront d'initialiser correctement chacun des objets que tu as créer.

    Pour ce qui est de ton problème de "plantage", il faudrait que tu mettes un petit bout de code de ce que tu as fait.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Merci AF_2.8, ce que tu dis est très clair.
    Il faut donc que je fasse un constructeur sans paramètre, et à coté une méthode (que je pourrais appeler "initialisation") qui elle s'occupera de définir les attributs.
    Je pense que j'ai compris, j'essaye ça tout de suite !

    [EDIT :]

    Par contre je ne connais pas la syntaxe avec setvalue. Quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Animal ensemble_des_animaux[20];
    Animal ensemble_des_animaux[0],setvalue(...);
    je reçois 2 messages d'erreur :

    conflicting declaration 'Animal ensemble_des_animaux [0]'

    'ensemble_des_animaux' has a previous declaration as 'Animal ensemble_des_animaux [20]'



    Je ne sais pas ce que je dois mettre a la place des points de suspension. Quelle serait la bonne façon de faire ?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut
    Le tableau est entièrement instancié lorsque tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Animal ensemble_des_animaux[20];
    Tu ne peux pas instancier individuellement chacun des éléments du tableau (*)(**)

    La bonne solution n'est pas de farcir ton code d'accesseur/mutateur (setter/getter) car ils brisent l'encapsulation.

    Une solution assez satisfaisante est de passer par un conteneur de type std::vector (ou std::array si tu as un compilateur TR1 ou C++0x) qui te permet d'ajouter tes éléments un à un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector<Animal> les_animaux;
    les_animaux.push_back(Animal(Cheval,1));
    les_animaux.push_back(Animal(Mouton,2));
    //etc...

    (*) certaines classes très simples (type POD indique ce que très simple veut dire) peuvent s'initialiser avec des accolades :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Animal ensemble_des_animaux[20]={
    {Cheval,1},
    {Mouton,2},
    etc...
    };
    Mais inutile de te préoccuper de ce cas particulier pour l'instant.

    (**) Avec C++0X, la nouvelle version de C++ et les listes d'initialisations, alors il sera possible d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Animal ensemble_des_animaux[20]={
    {Cheval,1},
    {Mouton,2},
    etc...
    };
    même pour des classes plus compliquées (non POD).

  7. #7
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Animal ensemble_des_animaux[0],setvalue(...);
    Cette second ligne ne fera pas ce que tu crois(*) (appel d'une méthode de l'objet situé à la première case de ton tableau). D'après ce que je comprend tu voudrais plutot faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ensemble_des_animaux[0].initialisation(parametre1, parametre2); // autant de paramètre que tu veux
    Toutefois une meilleure solution serait de se tourner vers la classe std::array qui simule le fonctionnement des tableaux tout en rajoutant des fonctionnalités. Tu peux l'inclure et l'utiliser comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <tr1/array>
     
    // utilisation :
    ///       taille, Type contenu dans le tableau
    std::tr1::array<20, Animal> ensemble_des_animaux( Animal(parametre1, parametre2) ); // au lieu d'utiliser un méthode initialisation, tu peux spécifier quel constructeur d'Animal appélé avec les parametre que tu veux
     
    ensemble_des_animaux[4].appelDuneMethode(); // s'utilise comme un tableau normal

    (*) si je ne me trompe pas elle signifie pour le compilateur "Instancie un tableau de 0 éléments Animal nommé ensemble_des_animaux et instancie un objet de type Animal nommé setvalue en apellant un constructeur spécifique"). Evidement, cette ligne ne peut pas compiler pour trois raison : ensemble_des_animaux est un nom de variable déjà attribué, un tableau de 0 élément est illégal et on peut envoyer des points de suspension à un constructeur.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Merci à vous deux d'avoir pris le temps de me répondre et de me corriger !
    Je connaissais de (très) loin les vectors, et donc j'avais plutôt peur de m'y essayer.
    J'en conclus qu'il est temps pour moi de travailler sérieusement les tableaux dynamiques...
    En tout cas mon problème est résolu, merci à tous pour votre aide (ce forum est vraiment sympathique) !

    Bonne soirée,

    Actuenligne

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/03/2011, 10h17
  2. Réponses: 0
    Dernier message: 24/01/2011, 23h59
  3. Instancier une classe avec un arraylist et exception
    Par Chacha35 dans le forum Collection et Stream
    Réponses: 17
    Dernier message: 24/03/2010, 16h10
  4. Instancier une classe avec son nom
    Par Arrakis dans le forum Langage
    Réponses: 2
    Dernier message: 11/09/2009, 17h57
  5. [PHP 5.0] instancier une classe avec son nom dans une variable
    Par Nnay_ dans le forum Langage
    Réponses: 1
    Dernier message: 12/02/2009, 12h49

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