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 :

[deb.] Passage d'arg. pointeur + mot const avec mes. Erreur


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 [deb.] Passage d'arg. pointeur + mot const avec mes. Erreur
    Bonjour,

    Cette question fait plus ou moins suite a ma precedente question sur l'utilisation simultanee de plusieures class.
    Probl de syntax decl de pl class

    Je travaille pour le moment sur un code qui comprends plusieures class et ou une classe (A) utilise entre autre des instances d'une autre class (B)pour initialiser ses propre composants.

    Pour l'instant je me limite au composant "t" de la class A qui est un pointeur
    sur un array char.

    Je veux ecrire une surcharge d'op. << pour imprime le contenu des carac. d'une instance et je l'ai redige de cette facon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Surcharge de l'operateur cout<<
    ostream& operator << (ostream& flux, const morceau& M){
    const char* titr;
    cout << "\n Caracteristique du morceau : ";
    cout << "\n Titre : ";
    titr = M.get_Titre();       //Ligne 64
    flux << titr;
    cout << "\n Duree : ";
    return flux;
    }//Fin Surcharge cout
    Pour ce code jerecois le message d'erreur

    Compilateur: Default compiler
    Building Makefile: "C:\Dev-Cpp\Devoir_3\Makefile.win"
    Exécution de make...
    make.exe -f "C:\Dev-Cpp\Devoir_3\Makefile.win" all
    g++.exe -c morceauImpl.cpp -o morceauImpl.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    morceauImpl.cpp: In function `std::ostream& operator<<(std::ostream&, const morceau&)':
    morceauImpl.cpp:64: error: passing `const morceau' as `this' argument of `const char* morceau::get_Titre()' discards qualifiers

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

    Exécution terminée
    Comme dit je n'arrive pas a comprendre ce que je dois faire avec ca.
    Bien sur t est private

    J'ai un selecteur ecrit ainsi avec son implementation

    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
     
    //retour du titre du morceau Selecteur public dans classe morceau
    const char* get_Titre(void); 
     
    et ici son implementation
     
    //retour du titre du morceau
    const char* morceau::get_Titre(void){
    return t;    
        }           
     
    //Ici le constructeur utilise
    //Impl. construc. par init.
            morceau::morceau(char* ti, duree du){
                               t = ti;
                               d = du;
                                     }
    J'ai essaye la solution naive en ecrivant const partout ou cela avait l'air raisonnable, mais bon voila


    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    J'ai essaye la solution naive en ecrivant const partout ou cela avait l'air raisonnable, mais bon voila
    Tu as oublié le plus important : getTitre(). En effet, cette fonction membre ne modifiant pas les données de la classe (c'est typiquement le cas pour tous les accesseurs de type get), elle doit être constante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* get_Titre(void) const;

  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
    Merci pour la reponse ca marche c'est super. Par extention je veux faire la meme chose avec L'instance duree contenue dans mon objet morceau.

    La seule chose que je sais faire est de reprendre l'experience precedente pour la developpe un peu plus loin jusqu'a ce que cela n'aille plus. Ici le temps de latence est trop court a mon gout.

    En appliquant l'experience precedente j'ai ecrit cela

    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
     
    J'ai toujours le meme constructeur avec l'objet duree que je cherche a reprendre pour affichage
     
    //Impl. construc. par init.
            morceau::morceau(char* ti, duree du){
                               t = ti;
                               d = du;
                                     }
     
    Ici j'ai ma surcharge ou je veux maintenant charge duree en vue de reaffichage
    //Surcharge de l'operateur cout<<
    ostream& operator << (ostream& flux, const morceau& M){
    const char* titr;
    const duree durdur;
    cout << "\n Caracteristique du morceau : ";
    cout << "\n Titre : ";
    titr = M.get_Titre();       //Ligne 64
    flux << titr;
    cout << "\n Duree : ";
    durdur = M.get_duree();  //Ligne 68
    ///////Ici idee question 1
    int s, m;                        //decl var loc
    s  = durdur.get_sec();    //init var loc avec selecteur de la classe durree
    m = durdur.get_min();   //init var loc avec selecteur de la classe durree
    //Affich m et s
    //
    ///////
    return flux;
    }//Fin Surcharge cout
    Ici en suivant la decl de methode et l'implementation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //retour de l'instance duree decl de la methode 
    const duree get_duree(void) const;     
     
    //retour de l'instance duree utilise dans l'objet
    const duree morceau::get_duree(void) const{
    return d;    
           }
    L'idee est de charge l'instance de duree dans durdur et ensuite d'en extraire pour affichage les deux membres de donnees a travers deux selecteurs implante dans la classe durre.

    Ca c'est la premiere question, est-ce une maniere de procede?

    Pour la deuxieme,je traine toujours mes manques de connaissance de la syntax, et j'ai le message d'erreur suivant



    make.exe -f "C:\Dev-Cpp\Devoir_3\Makefile.win" all
    g++.exe -c morceauImpl.cpp -o morceauImpl.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"
    morceauImpl.cpp: In function `std::ostream& operator<<(std::ostream&, const morceau&)':
    morceauImpl.cpp:68: error: passing `const duree' as `this' argument of `duree& duree::operator=(const duree&)' discards qualifiers

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

    Exécution terminée
    C'est la deuxieme question quesque je dois faire lacontre?

    D'avance merci

    marc_3

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ca c'est la premiere question, est-ce une maniere de procede?
    Plus ou moins, sauf qu'au lieu de faire un retour par valeur pour ton accesseur get_duree (dont le retour n'a plus lieu d'être const puisqu'il s'agit de toute façon d'une copie), mieux vaut faire un retour par référence constante ; ça t'évitera une copie et les effets de bords qui peuvent en découler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const duree& get_duree(void) const;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ostream& operator << (ostream& flux, const morceau& M)
    {
        ...
        const duree& durdur = M.get_duree();
        ...
    }
    C'est la deuxieme question quesque je dois faire lacontre?
    Tu as déclaré durdur en tant que constante, et tu tentes de le modifier par la suite (durdur = M.get_duree()). Cf. ce que je viens de raconter avec les références constantes.

  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
    loulou,

    j'ai plus le temps maintenant avec ca. Je vais reprendre avec demain.
    Merci pour le coup de main

    Marc_3

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Bonjour,
    nouvel obstacle j'essaie de finir cette histoire de chargement des variables privee de mon objet duree, qui sont ns nombreSecondes et nm nombreMinute.

    Comme dit plus haut j'ai dans ma class duree les selecteurs suivant avec leurs implementations:
    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
     
    //Decl methode
    // est retourné: le nb de sec de IC
    const int get_Sec(void) const;    
     
     // est retourné: le nb de min de IC
    const int get_Min(void) const;    
     
    //Implementation
    //retour de duree en secondes du morceau
    const int duree&::get_durSec(void) const {    //Ligne 69
    return ns;
        }         
     
    //retour de duree en secondes du morceau
    const int duree&::get_durMin(void) const {    //Ligne 74
    return nm;
        }
    Ca c'est le message d'erreur que j'ai avec

    g++.exe -c DureeImpl.cpp -o DureeImpl.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    DureeImpl.cpp:69: error: expected init-declarator before '&' token
    DureeImpl.cpp:69: error: expected `,' or `;' before '&' token
    DureeImpl.cpp:74: error: expected init-declarator before '&' token
    DureeImpl.cpp:74: error: expected `,' or `;' before '&' token
    make.exe: *** [DureeImpl.o] Error 1
    Exécution terminée
    Ici en suivant c'eest ce que j'ai ecris comme surcharge d'operateur qui a besoin de ce morceau de 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
     
    //Surcharge de l'operateur cout<<
    ostream& operator << (ostream& flux, const morceau& M){
    const char* titr;
     
    cout << "\n Caracteristique du morceau : ";
    cout << "\n Titre : ";
    titr = M.get_Titre();       
    flux << titr;
    cout << "\n Duree : ";
    const duree& durdur = M.get_duree(); 
    //const int s, m;                 //decl var loc
    const int s& = durdur.get_Sec();  //init var loc avec selecteur de la classe durree
    const int m& = durdur.get_Min();  //init var loc avec selecteur de la classe durree
    //Affich m et s, encore a faire 
     
     
    return flux;
    }//Fin Surcharge cout
    Quest_1) Bon evidement maintenant que je suis j'aimerai bien sortir de cette histoire avec une solution qui marche et j'aimerai bien savoir quoi faire avec. Comment faire pour resoudre le mes. d'erreur?

    Quest_2) Mais en reflechissant, je me demande si je n'aurai pas mieux fait, au tout debut, de faire une autre surcharge a l'interieur de la class duree et appele cette surcharge ensuite depuis l'interieur de ma class morceau. Est-ce que ce serait mieux, et possible?

    D'avance merci

    marc_3

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Quest_1) Bon evidement maintenant que je suis j'aimerai bien sortir de cette histoire avec une solution qui marche et j'aimerai bien savoir quoi faire avec. Comment faire pour resoudre le mes. d'erreur?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const int duree&::get_durSec(void) const {    //Ligne 69 
    return ns; 
        }
    duree&::get_durSec, ça n'a pas de sens (le & doit suivre le type du retour, pas le nom de la classe !).

    C'est, au choix :

    - const int duree::get_durSec() const
    - const int& duree::get_durSec() const
    - int duree::get_durSec() const

    Le premier n'est jamais utilisé (comme je te l'ai dit, tu vas renvoyer une copie et non une référence sur la donnée membre, inutile donc qu'elle soit constante).

    Le second est à utiliser systèmatiquement, sauf pour les types primitifs (comme c'est le cas ici).

    Donc, utilise la troisième

    Quest_2) Mais en reflechissant, je me demande si je n'aurai pas mieux fait, au tout debut, de faire une autre surcharge a l'interieur de la class duree et appele cette surcharge ensuite depuis l'interieur de ma class morceau. Est-ce que ce serait mieux, et possible?
    Effectivement, c'est ce qu'il vaut mieux faire.

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    OK je vais reprendre le tout depuis le debut en reprenant l'archtecture des classes, j'ai trop tourne en rond sur ce truc et je ne sais plus a qu'elle version j'en suis. En meme temp je vais ferme cette question.

    Merci pour l'aide

    Marc_3

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

Discussions similaires

  1. [AJAX] Passage d'une variable très longue avec AJAX
    Par Figaro83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 18/09/2006, 16h53
  2. STL, pointeurs et const... confusion!
    Par vdumont dans le forum SL & STL
    Réponses: 2
    Dernier message: 12/05/2006, 20h51
  3. Réponses: 5
    Dernier message: 21/11/2005, 01h40
  4. probleme avec le mot const et operateur==
    Par elekis dans le forum C++
    Réponses: 4
    Dernier message: 06/05/2005, 13h21
  5. Passage d'un enregistrement à un autre avec TAB
    Par Cécile154 dans le forum Access
    Réponses: 2
    Dernier message: 16/02/2005, 14h47

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