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]Syntax Appel dans une classe de meth. d?une autre


Sujet :

C++

  1. #1
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut [deb]Syntax Appel dans une classe de meth. d?une autre
    Bonjour,
    La suite de mes petit problemes. Je dois implemente une surcharge pour comparaison de deux membre de classe de deux objets differents.
    Sa c'est le construc des objets a comparer et la comparaison se fait sur les objets duree inclus.
    morceau(char* ti, duree du);
    Pour cela j'ai dans une de mes classes la methode get_tempsTot() implementee dans ma classe duree. La duree a compare est les min et sec additionee dans la meth concernee et ns, nm sont des membres de la classe duree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //retour de duree en secondes du morceau dans classe duree
    int duree::get_tempsTot(void){
    int tot;    
    tot = (nm * 60) + ns;    
    return tot;
        }
    Ca c'est ma surcharge qui a besoin des deux durees pour faire la comparaison. Implementee dans ma classe morceau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Surcharge de l'operateur ==
    int morceau ::operator ==(const morceau& M){
    int tempsThis, tempsM;                 //Decl int pour comparaison longeur
    const duree& dur = M.get_duree();      //Chargement de IC objet
    tempsThis = this.get_tempsTot();
    tempsM    = M.get_tempsTot();        //Init pour comparaison temps
    if ( tempsThis == tempsM ){
       return 1;
     }else{
      return 0;
    }
    }//Fin Surcharge equivalence "=="
    Ici s'est mon message d'erreur, toujours a la pointe du progres j'imaginais il y a encore peu que le #include "duree.h" inclus plus haut dans le code devait palier a cela.
    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 member function `int morceau::operator==(const morceau&)':
    morceauImpl.cpp:81: error: 'const class morceau' has no member named 'get_tempsTot'
    make.exe: *** [morceauImpl.o] Error 1
    Exécution terminée
    L'idee est que la surcharge soit utilisee ensuite pour faire savoir a l'utilisateur quel est le morceau le plus court ou si leur longeur est egale

    Mon probleme est que je ne trouve pas la syntax pour pouvoir appele ma methode dans la classe duree. Non seulement pour l'argument M mais encore plus pour ce qui concerne l'objet appelant du if (A == B).
    A serai L'appelant et B l'appele dans ma surcharge

    La surcharge est dans mon autre classe morceau.

    Si quelqu'un peut m'aiguille

    D'avance merci

    marc_3

  2. #2
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    pourquoi appelles tu get_tempsTot sur l'objet morceau alors que c'est une methode de l'objet duree ?

    de plus la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const duree& dur = M.get_duree();
    ne sert absolument a rien dans ton exemple puisque dur n'est utilisé nulle part.

    XXiemeciel

  3. #3
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    Les membres de donnees de l'objet morceau sont une chaine de caracteres et un objet duree lui-meme constitue de min et de seconde.
    Mais la comparaison se fait entre objet morceau. Ce qui fait que la surcharge est a ecrire dans l'implementation de morceau.

    J'ai cru plus simple de definir une methode dans l'objet duree qui me donne unne duree totale plutot que des minute et sec.

    Pour la ligne qui n'a plus de sens je l'ai oublie apres une tentative precedente qui avait cette tete la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const duree& dur = M.get_duree(); 
    tempsM    = dur.get_tempsTot(); 
     
    avec cette erreur la
     
    82 C:\Dev-Cpp\Devoir_3\morceauImpl.cpp passing `const duree' as `this' argument of `int duree::get_tempsTot()' discards qualifiers
    Quand je recois l'argument M dans ma surcharge je voulais en extraire tous d'abord l'IC duree inclus et ensuite de cet IC mon temps total cumule. Pour enfin faire la comparaison.

  4. #4
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut


    Je n'avais pas compris que ta premiere remarque avais pour objet de me faire me poser la question en question

    Ceci est la surcharge qui a un peu plus de sens
    get_duree(); me renvoie un objet duree complet avec tous ses composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Surcharge de l'operateur ==
    int morceau ::operator ==(const morceau& M){
    int tempsThis, tempsM;                 //Decl int pour comparaison longeur
    const duree& dur = M.get_duree();
    const duree& dure = this.get_duree();
    tempsThis = dure.get_tempsTot();
    tempsM    = dur.get_tempsTot();          //Init pour comp. temps L 82
    if ( tempsThis == tempsM ){
       return 1;
     }else{
      return 0;
    }
    }//Fin Surcharge equivalence "=="
    Bon voila peut etre que le probleme est mieux pose

  5. #5
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    peut etre que sa te faciliterais la vie de rajouter une toute petite methode get_tempsTot sur l'objet morceau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int morceau::get_tempsTot()
    {
         const duree& dur = this.get_duree();
         return dur.get_tempsTot();
    }
    XXiemeciel

  6. #6
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    je vais de ce pas essaye ca. J'ai toujours ete tres fort pour me complique la vie et reste ebahi par les choses evidentes.

    Merci pour la reponse, mais a part cela est-ce que cela est possible de faire un truc comme j'ai fait? Y aurai t'il un compilateur gentil qui me comprenne?

  7. #7
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    ca ne marche pas non plus je l'ai fait comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //la methode que tu m'as suggerer dans l'implementation
     
    int morceau::get_tempsTot()
    {
         const duree& dur = this.get_duree();     //ligne 113
         return dur.get_tempsTot();                   //ligne 114
    }
    Ici en suivant ma surcharge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Surcharge de l'operateur ==
    int morceau ::operator ==(const morceau& M){
    int tempsThis, tempsM;                 //Decl int pour comparaison longeur
    //const duree& dur = M.get_duree();
    tempsThis = this.get_tempsTot();       //ligne 81
    tempsM    = M.get_tempsTot();          //ligne 82
    if ( tempsThis == tempsM ){
       return 1;
     }else{
      return 0;
    }
    }//Fin Surcharge equivalence "=="
    Et ici mon message d'erreur
    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 member function `int morceau::operator==(constmorceau&)':
    morceauImpl.cpp:81: error: `get_tempsTot' is not a type
    morceauImpl.cpp:81: error: request for member of non-aggregate type before '(' token
    morceauImpl.cpp:82: error: passing `const morceau' as `this' argument of `int morceau::get_tempsTot()' discards qualifiers
    morceauImpl.cpp: In member function `int morceau::get_tempsTot()':
    morceauImpl.cpp:113: error: `get_duree' is not a type
    morceauImpl.cpp:113: error: request for member of non-aggregate type before '(' token
    morceauImpl.cpp:114: error: passing `const duree' as `this' argument of `int duree::get_tempsTot()' discards qualifiers
    make.exe: *** [morceauImpl.o] Error 1
    Exécution terminée
    Si tu as encore une idee

  8. #8
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    En C++ this est un pointeur donc il faut appeler this-> et non pas this.

    XXiemeciel

  9. #9
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    je sais que je l'ai deja lu quelque part dans un script mais c'est la premiere fois que j'utilise concretement un pointeur et bien sur j'ai oublier ce ->

    C'est deja un gros progres

    Avec le meme code corrige pour pointeur je n'ai plus que ceci comme message d'erreur. Il faut dire que si il etaient un peu plus explicite on economiserait beaucoup de temps.
    -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    morceauImpl.cpp: In member function `int morceau::operator==(const morceau&)':
    morceauImpl.cpp:82: error: passing `const morceau' as `this' argument of `int morceau::get_tempsTot()' discards qualifiers
    morceauImpl.cpp: In member function `int morceau::get_tempsTot()':
    morceauImpl.cpp:107: error: passing `const duree' as `this' argument of `int duree::get_tempsTot()' discards qualifiers
    make.exe: *** [morceauImpl.o] Error 1
    Exécution terminée
    J'ai du mal aussi avec ces discards qualifiers je n'ai pas encore compris

  10. #10
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    montre moi la fonction get_duree.

    XXiemeciel

  11. #11
    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
    Points : 15 920
    Points
    15 920
    Par défaut
    Toujours ton problème de const (que tu devrais clarifier une bonne fois pour toute si tu ne veux pas te payer ce genre d'erreur à chaque ligne de code).

    Tes accesseurs en lecture (get_xxx()) doivent être const, puisqu'ils ne modifient pas les données de la classe.

  12. #12
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    voila ici j'ai ma fonction get_duree() implementee dans morceau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const duree& morceau::get_duree(void) const{
    return d;    
           }
    Qui marche parsque deja testee dans le code et uitilisee dans la surcharge d'affichage.

    Pour les const j'en ai mis tant que j'ai pu partout et bien finalement j'ai toujours ce discard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Decl de la methode
    const int get_tempsTot()const;
     
    //Implementation de la meth
    const int morceau::get_tempsTot()const
    {
         const duree& du = this->get_duree()const;   //Ligne 106
         return du.get_tempsTot();                           //Ligne 107
    }
    Sa c'est mon dernier message d'erreur en date

    morceauImpl.cpp: In member function `const int morceau::get_tempsTot() const':
    morceauImpl.cpp:106: error: expected `,' or `;' before "const"
    morceauImpl.cpp:107: error: passing `const duree' as `this' argument of `int duree::get_tempsTot()' discards qualifiers
    make.exe: *** [morceauImpl.o] Error 1
    Exécution terminée

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    tu n'as pas besoin de mettre const à la fin de la ligne 106: Le compilo appelle automatiquement la version const de la méthode.

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Note: j'ai pas lu tout le thread, j'interviens au beau milieu...

    Citation Envoyé par Marc_3
    voila ici j'ai ma fonction get_duree() implementee dans morceau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const duree& morceau::get_duree(void) const{
    return d;    
           }
    Je me méfie des membres qui renvoient une référence constante sur des objets de classes ayant des sémantiques de valeur.
    • on se demande toujours quelle est la durée de vie de la référence retournée
    • si par la suite on désire changer l'implémentation et qu'on n'a plus d'objet dont la durée de vie est plus longue que la fonction, il faut changer l'interface

    Si la classe est lourde à copier, je me demande si ça vaut bien la peine d'avoir une classe à sémantique de valeur (oui, je trouve que le choix de la SL d'une sémantique de valeur pour les conteneurs n'est pas un bon choix).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Decl de la methode
    const int get_tempsTot()const;
     
    //Implementation de la meth
    const int morceau::get_tempsTot()const
    {
         const duree& du = this->get_duree()const;   //Ligne 106
         return du.get_tempsTot();                           //Ligne 107
    }
    Sa c'est mon dernier message d'erreur en date

    morceauImpl.cpp: In member function `const int morceau::get_tempsTot() const':
    morceauImpl.cpp:106: error: expected `,' or `;' before "const"
    Il ne faut pas de const à la fin.
    morceauImpl.cpp:107: error: passing `const duree' as `this' argument of `int duree::get_tempsTot()' discards qualifiers
    duree::get_tempsTot n'est pas un membre const de duree, mais tu l'appelles sur un objet qui est const.

    Remarques supplémentaires:
    • retourner un const int n'a guère d'intérêt
    • il est rarement nécessaire (en dehors de la définition des templates) d'utiliser this

  15. #15
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    Juste un mail pour vous remercier tous pour vos reponses. Je dois dire que grace a vous mon travail prend une meilleure tournure.
    (et en plus sa marche)
    Marc_3

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

Discussions similaires

  1. Instance d'une classe fille à partir d'une classe mère
    Par Mathieu Salles dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 17/10/2012, 16h09
  2. Réponses: 6
    Dernier message: 14/12/2008, 02h12
  3. Réponses: 4
    Dernier message: 06/04/2008, 18h34
  4. Héritage d'une classe MFC et d'une classe non MFC
    Par Etienne Paquette dans le forum MFC
    Réponses: 7
    Dernier message: 04/12/2007, 20h19
  5. Réponses: 14
    Dernier message: 15/12/2005, 18h46

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