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 :

[ded]Syntax Decl tabl. d'Inst. Classe comme membre classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut [ded]Syntax Decl tabl. d'Inst. Classe comme membre classe
    Bonjour,
    J'ecris une classe qui a pour membre un tableau d'instance d'une autre classe et j'aimerai en meme temps utilise un pointeur.

    J'ai bien trouve des exemple pour faire des decl. dans une implementation directement dans un main mais pas comme membre de classe.

    Est- ce que quelqu'un peut me montre cela.

    Pour l'instant j'ai pour ma classe disque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class disque{
    private:
    /////////////////////////////
    //Decl. Variables de class
    //////////////////////////////       
            morceau *tablMorceau;        // Decl. d'un pointeur sur tableau de   morceaux  
            int nBM;                              // nombre de morceaux
    Et plus loin dans l'implementation j'ecris une surcharge pour remplir un tableau pointe par morceau *tablMorceau
    Fragment appele dans main. Morceau est un des elem du tableau pointe
    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
     
    //surcharge de l'operateur >>cin , Saisie pour objet disque
    istream& operator >> (istream& fluxD, disque& D){
     
    cout << "\n Donnez SVP un nombre de morceaux pour le disque ";
    cout << "\n compris entre min = 1 et max = 15, entree << = ";
                              //Creation disque = tableau de morceaux 
    int nbMorc;               //Decl var nb de morceau choisit
    cin>>nbMorc;              //Init var nb de morceau choisit
                              //Test if saisie acceptee creation disque else refaire saisie 
                              //maxMorc constante decl dans disque.h
    if (nbMorc > 0 && nbMorc < maxMorc){               //Debut If 
    D.nBM = nbMorc;                                    //Chargement nb de morceau dans IC
    } else{                                            //Fin IF Debut else  
    while (nbMorc < 0 || nbMorc > maxMorc){            //While saisie incorrecte pour nb. Morceau 
    cout << "\n L'entree du nombre de morceaux(s) est refusee";       
    cout << "\n Veuillez refaire la saisie du nb de morceau(s) : ";
    cout <<"\n";
    cin>>nbMorc;    
    D.nBM = nbMorc;   
          }                                            // Fin While saisie OK                                           
    }                                                  // Fin else saisie terminee
    cout << "\n Le nb de morceau(s) est egal a : "<<nbMorc;
    cout <<"\n";
    morceau *tableauMorceau;                           //Decl. d'un pointeur    
    tableauMorceau = new morceau[nbMorc];              //Decl. du tableau de morceaux 
                                                       //Remplissage du disque    
    for (int i = 0; i < nbMorc; i++ ){                 //Debut boucle for pour remplissage du disque
    morceau M;                                         //Decl. morceaux
    cin>> M;                                           //chargement
    tableauMorceau[i] = M;
        }                                              //Fin boucle for = disque remplis
    D.*tablMorceau = *tableauMorceau;
    return fluxD;
    }                  //Fin de surcharge cin pour disque
    L'idee est de remplir le tableau a travers le for() et ensuite d'associe l'adresse du tableau au pointeur membre de classe.
    J'en ai beaucoup parle a mon compilateur qui me renvoie regulierement ceci


    disque.cpp: In function `std::istream& operator>>(std::istream&, disque&)':
    disque.cpp:64: error: `tablMorceau' undeclared (first use this function)
    disque.cpp:64: error: (Each undeclared identifier is reported only once for each function it appears in.)
    make.exe: *** [disque.o] Error 1
    Exécution terminée
    En fait par analogie je veux faire avec
    D.*tablMorceau = *tableauMorceau;
    Ce que je fait avec cela qui n'a pas l'air de pose de probleme
    D.nBM = nbMorc;

    Est-ce que quelqu'un peu m'aider?
    (Si vous pensez que l'idee de base n'est pas terrible SVP faite en part)
    D'avance merci

    Marc_3

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Un tableau brut ne s'affecte pas directement comme tu veux le faire, il faut le copier élément par élément (avec std::copy par exemple). A part ça, la syntaxe pour y accéder, c'est sans l'étoile (ça fait partie du type et non du nom).

    Mais pourquoi ne pas utiliser directement le tableau de ta classe, plutôt que passer par un temporaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D.tablMorceau = new morceau[nbMorc];
    ...
    Quelques remarques :

    - Il est deconseillé d'utiliser une quelconque sortie dans un opérateur >> d'extraction (imagine que tu extrais tes données à partir d'un fichier et non à partir de l'entrée standard ?). Il vaut mieux que ce soit à l'appelant de gérer la resaisie en cas d'erreur.

    - std::vector c'est vraiment mieux pour les tableaux dynamiques (tu t'embêteras beaucoup moins)

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Pour la surcharge j'ai bien note la remarque en cas de lecture directe de fichier. Ici je ne traite que le cas de la saisie directe a la console.
    Je vais rester comme ca pour le moment. Je dois rendre ce truc aussi

    Pour l'utilisation des vecteur et bien cela ne fait pas partie de l'exo. On nous demande un tableau gerre de facon de preference dynamique

    Je ne comprend pas tout a fait la syntax que tu me donne en rapport avec la classe.

    la decl de mon tableau dans ma classe en prive (pas de changement).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /////////////////////////////
    //Decl. Variables de class
    //////////////////////////////       
            morceau *tablMorceau;        // Morceaux  
            int nBM;          // nombre de morceaux
    Et l'acces directe a ce tableau avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    D.tablMorceau = new morceau[nbMorc];               //Decl. du tableau de morceaux  
    for (int i = 0; i < nbMorc; i++ ){                 //Debut boucle for pour remplissage du disque
    morceau M;                                         //Decl. morceaux
    cin>> M;                                           //chargement
    D.tablMorceau[i] = M;
        }                                              //Fin boucle for = disque remplis
     
    //delete [ ] tablMorceau;                          //Est-ce que je dois le faire?
    //Pourquoi est ce qu'il est decrit comme non declare, il est toujours dans la portee non?
     
    return fluxD;
    }                  //Fin de surcharge cin pour disque
    Le compilateur est d'accord mais ja sais plus trop ce que j'ai fait.

    Est-ce que le tableau fait bien partie de classe?
    Et dans mes exemples je suis suppose detruire le tableau a la fin du bloc.
    Est_ce que je dois le faire aussi ici, parsque avec j'ai le message d'erreur suivant:
    -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    disque.cpp: In function `std::istream& operator>>(std::istream&, disque&)':
    disque.cpp:65: error: `tablMorceau' undeclared (first use this function)

    disque.cpp:65: error: (Each undeclared identifier is reported only once for each function it appears in.)

    make.exe: *** [disque.o] Error 1

    Exécution terminée


  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    1- Tu ne dois détruire ton tableau que lorsque tu n'en as plus besoin, pas juste après l'avoir rempli

    2- L'erreur donnée par le compilo vient sans doute du fait que tu as oublié un "D." devant un "tablMorceau".

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Merci pour la reponse.
    J'ai reusis a faire tourne tous ce que je voulais jusque a maintenant avec ca.

    Marc_3

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

Discussions similaires

  1. probleme de classe, classe comme membre de classe
    Par thhomas dans le forum Langage
    Réponses: 1
    Dernier message: 08/09/2010, 11h27
  2. [deb.]Probleme de syntax decl de pl class
    Par Marc_3 dans le forum C++
    Réponses: 11
    Dernier message: 01/12/2005, 12h23
  3. [Comm.jar] Classe inconnue à l'exécution
    Par Mister Nono dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 15/02/2005, 10h26
  4. syntaxe drop table exists
    Par guns17 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/02/2005, 10h50
  5. [syntaxe]Creation table avec nom dynamique
    Par ZuZu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/09/2004, 18h01

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