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 :

const Point & et this


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut const Point & et this
    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
     
    #include <iostream>
    using namespace std;
     
    class Point
    {
    protected:
       int taille;
      int *dat;
    public :
      Point(){}
     
      Point(int n)
        {
         taille = n;
          dat =new int[n];
        }
      int size(){return this->taille;}
      inline int & operator []( int i){return this->dat[i];}
      friend Point operator +(const  Point&  ,const  Point&  );
    };
     
    inline Point  operator+(const Point&  x1,const Point&  x2)
    {
      Point x(x1.size());
      for(int i=0;i<x1.size();i++)
      {
        x[i]= x1[i]+x2[i];
      }
      return x;
    }
     
    int main()
    {}
    La j'ai un message d'erreur
    _rm3.cpp: In function «Point operator+(const Point&, const Point&)»:
    _rm3.cpp:24: erreur: passing «const Point» as «this» argument of «int Point::size()» discards qualifiers
    Quelqu'un peut m'aider à résoudre ce problème???
    (hormis la solution d'enlever le const)

  2. #2
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int size() const {return this->taille;}
    probablement.

    peut être qu'implémenter operator +, par += serait le bienvenue.
    ne devrait être amie de Point (pas besoin)
    attention au problème de new dans le constructeur sans operateur = et de constructeur de copie.
    (sans compter la fuite à cause du destructeur manquant)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Merci ca à l'air de marcher.

    J'ai contruit cette classe point pour illustrer mon probleme donc sans les précautions que tu mentionnes.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    En revanche si je remplace le type int * par un vector<int> alors ca plante de nouveau:
    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
     
    #include <iostream>
    #include <vector>
    using namespace std;
     
    class Point
    {
    protected:
      vector<int> dat;
     
    public :
      Point(){}
     
      Point(int n)
        {
         dat.resize(n);
        }
      int size()const {return (this->dat).size();}
      inline int & operator []( int i)const {return (this->dat)[i];}
    };
     
    inline Point  operator+(const Point&  x1,const Point&  x2)
    {
      Point x(x1.size());
      for(int i=0;i<x1.size();i++)
      {
        x[i]= x1[i]+x2[i];
      }
      return x;
    }
     
    int main()
    {
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _rm3.cpp: In member function «int& Point::operator[](int) const»:
    _rm3.cpp:20: erreur: invalid initialisation of reference of type «int&» from expression of type «const int»

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Normal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline int & operator []( int i)const {return (this->dat)[i];}
    Dans cette expression, ton vector est constant, et l'opérateur [] d'un vector constant renvoie une réfèrence constante. Il serait préfèrable de déclarer cet opérateur en double:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inline int & operator []( int i){return (this->dat)[i];}
    inline const int & operator []( int i)const {return (this->dat)[i];}

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Merci amigo,
    Ca marche!!!!!!

    A retenir l'pérateur [] d'un vecteur constant renvoie une référence constante.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une référence constante ou une valeur ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre averti
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Par défaut
    Bonjour,

    j'ai jamais eu ce problème car je met toujours en const des fonctions qui ne modifient pas les variables de ma classe, mais j'ai une question sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    _rm3.cpp: In function «Point operator+(const Point&, const Point&)»:
    _rm3.cpp:24: erreur: passing «const Point» as «this» argument of «int Point::size()» discards qualifiers
    Pourquoi si on ne met pas de const ça ne va pas ?

    Edit:
    Après reflexion, les instances déclarées comme const, elles ne peuvent appeler que des fonctions membres const, c'est ça ?

  9. #9
    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
    C'est ça. C'est tout l'intérêt d'avoir des fonctions membre const.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Citation Envoyé par Médinoc
    Une référence constante ou une valeur ?
    Normalement une réfèrence constante. Sinon la double déclaration que j'ai mis afficherait au moins un warning (retour de réfèrence sur une variable locale/temporaire).

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/03/2010, 21h19
  2. Réponses: 4
    Dernier message: 25/02/2010, 15h22
  3. Réponses: 20
    Dernier message: 16/11/2009, 23h04
  4. Réponses: 3
    Dernier message: 02/01/2009, 12h25
  5. Réponses: 22
    Dernier message: 14/12/2005, 15h01

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