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 :

Instanciation dynamique plusieurs objets


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut Instanciation dynamique plusieurs objets
    Bonjour,

    je voudrais savoir comment on peut declarer dynamiquement plusieurs objets d'une meme classe.
    Puis, pour chaque objet acceder aux methodes et aux attributs de cette classe?

    Ce que je fais c ca:
    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
     
    class A
    {
    A(); // constructeur
    -A(); // destructeur
    void ouvrir(A*);
     
    };
     
    int main()
    {
    A objet = new A[3];
    for(int i=0; i<3; i++)
    objet[i]->ouvrir(objet[i]);
     return 0;
    }
    quand je fais ca il me dit :
    error: base operand of `->' has non-pointer type `A'

  2. #2
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Bonjour,

    l'accès aux données et fonctions membres se fait par l'opérateur '.' pour les instances statiques et par '->' pour les instances dynamiques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A instance_statique;
    A* instance_dynamique = new A();
    instance_statique.ma_fonction_membre(arg1,arg2,...);
    instance_dynamique->ma_fonction_membre(arg1,arg2,...);
    Dans ton tableau, les objets sont créés statiquement.
    Il me semble plus propre de faire une classe dédiée aux tableaux d'instances de type A (class ArrayOfA).
    Regarde du côté des listes d'initialisation pour voir comment instancier correctement les éléments d'un ArrayOfA.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    C'est normal...

    Lorsque tu crées un tableau de A, la variable qui représente le table est, effectivement, un pointeur sur A, mais, dés que tu récupère un des éléments du tableau, tu obtiens... l'élément lui-même.

    ce serait donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A *tab=new A[3];
    tab[3].ouvrir();
    qu'il faut écrire.

    Au passage, il est peut être bon de rappeler que, lorsque tu définis une fonction membre non statique pour une classe, il y a un pointeur sur l'objet courent qui est passé de manière implicite, et que tu ne dois donc pas passer l'objet courent comme paramètre.

    Ainsi, ta classe A (et surtout la fonction membre ouvrir) peut parfaitement prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A
    {
        public:
            void ouvrir()
            {
                /* s'applique automatiquement à l'objet au départ duquel
                 * la fonction est appelée
                 * 
                 * On peut utiliser le pointeur this qui est passé de manière 
                 * implicite, mais l'usage de ce pointeur est... implicite ;)
                 */
            }
    };
    Si tu veux pouvoir appeler la fonction sans qu'elle ne dépende d'une instance particulière de A, il faut déclarer la fonction comme étant statique, et ce n'est que dans ce cas là qu'il faudra, effectivement, passer l'objet à manipuler au travers de cette fonction comme paramètre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut
    j'ai essayé de faire ce que tu ma dit koala01, mais quand je déclare la fonction membre en tant que statique, cette fois je rencontre l'erreur suivante :

    error: no matching function for call to `A::ouvrir(A&)'|

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Et pour cause...

    Si tu déclare ta fonction ouvrir comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void ouvrir( A* )
    il y a toujours le problème que tu ne récupère pas un pointeur sur ton élément mais bel et bien l'objet lui-même.

    Tu dois donc (solution préférée) déclare ouvrir de manière à ce qu'elle prenne une référence sur A comme argument sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void ouvrir (A & )
    ou (mais ce n'est pas l'idéal à cause de l'indirection que cela ajoute) transmettre "l'adresse à laquelle se trouve" ton objet de type A, si tu la déclare comme prenant un pointeur, à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A *tab=new A[3]
    for(int i=0;iw3;++i)
        A::ouvrir( &tab[i]);
    Il faut noter que, l'idéal serait enfin de préférer la classe vector, disponible dans l'espace de noms std par simple inclusion du fichier d'en-tête <vector> à l'utilisation d'un tableau "C style".

    Cette classe fournit tout ce que l'on peut attendre d'un tableau dynamique, mais de manière beaucoup plus sécurisante que ce qu'il y a moyen d'avoir avec les tableaux C styles

    Au final, si tu veux que la fonction ouvrir soit statique, pour ne pas dépendre d'une instance donnée de ta classe, ton code ressemblerait à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A
    {
        public:
            static void ouvrir(A & a)
            {
                /* utilisation de a comme s'il s'agissait d'un objet "classique"
                 * (PAS un pointeur)
                 */
            }
    };
    Qui serait utilisée sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <vector>
    int main()
    {
        /* si A a un constructeur par défaut, on peut directement créer
         * le tableau avec XXX objets de type A
         */
        std::vector<A> tab(15);
        /* mais on peut aussi rajouter des objets "quand on veut" */
        tab.push_back(A() );
        /*Pour ouvir les différents objets qui se trouvent dans tab */
        for(size_t i=0;i<tab.size();++i)
            A::ouvir(tab[i]);
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut
    merci c super ca marche

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

Discussions similaires

  1. Instanciation dynamique d'objets
    Par ToTo13 dans le forum Général Java
    Réponses: 11
    Dernier message: 08/01/2014, 21h27
  2. Instanciation dynamique d'objet
    Par C-Jay dans le forum Android
    Réponses: 5
    Dernier message: 17/09/2013, 16h30
  3. Instancier plusieurs objets malgré un constructeur privée
    Par derlone dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 01/05/2009, 22h37
  4. Générer dynamiquement plusieurs objets EDI
    Par Shuret dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/04/2008, 14h49
  5. Creer plusieurs objets dynamiquement
    Par kitsune dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/09/2007, 07h52

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