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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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