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

Langage C++ Discussion :

Attributs privés et surcharge d'opérateurs


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut Attributs privés et surcharge d'opérateurs
    Bonjour,

    Voici ma classe Dvector.h :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    /**
     * @class Dvector
     *
     * @brief Représentation d'un vecteur de réels, de dimension quelconque
     *
     */
    class Dvector {
     private:
      int dim;
      double * v;  
     
     public:
     
      /**
       * @brief Constructeur par défaut
       *
       * Construit un vecteur de dimension nulle
       */
      Dvector();
     
      /**
       * @brief Constructeur paramétré
       *
       * @param size dimension du vecteur
       * @param init optionnel : valeur d'initialisation (par défaut 0)
       *
       * Construit un vecteur de dimension dim, et initialise ses composantes à init
       */
      Dvector(int size, double init = 0);
     
      /**
       * @brief Constructeur par copie
       * @param Vect le vecteur source
       * Construit un nouveau vecteur par recopie de Vect
       *
       */
      Dvector(const Dvector & Vect);
     
      /**
       * @brief Constructeur à partir d'un fichier
       *
       * @param filename nom du fichier d'entree
       * 
       * Construit un vecteur à partir du fichier d'entree
       */
      Dvector(const char * filename);
     
      /**
       * @brief Destructeur
       */
      ~Dvector();
     
      /**
       * @brief Redéfinition de l'opérateur (), accès à une composante
       * @param i indice de la composante (de O a size() - 1)
       * @return la i-ème composante du vecteur (indices débutanst à 0)
       */
      double & operator()(int i);
     
      Dvector & operator+= (const Dvector & vect);
     
      /**
       * @brief Accesseur
       *
       * @return tableau des composantes
       *
       * Accède au tableau des composantes
       */
     
      double * getV();
     
       /**
       * @brief Accesseur
       * 
       * @return dimension du vecteur
       * 
       * Accède à la dimension du vecteur
       */
      int size();
     
      /**
       * @brief fonction d'affichage
       * 
       * Affiche le vecteur
       **/
      void print();
     
    };
    J'ai déjà surcharger l'opérateur ( ) pour accéder à une composante du vecteur.

    Je cherche à surcharger l'opérateur += dont voici mon implémentation ;

    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
    /* Surcharge d'opérateurs */
     
    double & Dvector::operator()(int i){
      return v[i];
    }
     
    Dvector & Dvector::operator+= (const Dvector & vect) {
     
      assert(dim == vect.dim);
      Dvector & V = *this;
      for (int i = 0; i < dim ; i++) {
    	  V(i) += vect.v[i];
      }
      return V ;
    }
    Quand je teste dans un main cela fonctionne mais déjà je ne comprends pas pourquoi ça compile puisque les attributs sont privés donc on est pas censé pouvoir accéder aux attributs de Vect ?

    Autre curiosité, si j'écris vect(i) à la place de vect.v[i] là ça ne compile plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: passing ‘const Dvector’ as ‘this’ argument of ‘double& Dvector::operator()(int)’ discards qualifiers
    Merci de vos conseils.

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,

    L'opérateur += est une fonction membre de la classe Dvector. Et comme n'importe quelle fonction membre, il est possible dans le corps de la fonction d’accéder aux membre privés d'une instance quelconque de la classe.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    Bonjour,

    D'accord! Je pensais que cela fonctionnait que pour l'objet sur lequel s'appliquait +=

    Une idée pour le problème V(i) ?

    Merci

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    C'est parce que tu essayes d’appeler une fonction membre non-const de Dvector (l'opérateur ()) depuis vect qui est une référence constante.
    Il faut que tu rajoutes une surcharge const de l'opérateur().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const double & Dvector::operator()(int i) const{
      return v[i];
    }
    Faut s'y faire à ce message d'erreur ("passing blabla as ‘this’ argument of blabla discards qualifiers") car il revient souvent (en gros dès qu'il y a un problème de constness)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    Hum j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const double & Dvector::operator()(int i) const{
      return v[i];
    }
    et dans .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const double & operator()(int i) const;
    et j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dvector.cpp: In member function ‘Dvector& Dvector::operator+=(const Dvector&)’:
    Dvector.cpp:99: error: assignment of read-only location ‘((Dvector*)V)->Dvector::operator()(i)

  6. #6
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Il manque un const dans le .h

    Eidt : Et j'ai bien parlé d'une surcharge hein ? Il faut que les deux surcharges soit présentes pour que le compilateur choisisse la bonne en fonction de la constness de l'appelant.

    Dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double & operator()(int i);
    const double & operator()(int i) const;
    Dans le .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    double & Dvector::operator()(int i){
      return v[i];
    }
    const double & Dvector::operator()(int i) const{
      return v[i];
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const double & Dvector::operator()(int i) const{
      return v[i];
    }
     
    double & Dvector::operator()(int i) {
      return v[i];
    }
    .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     double & operator()(int i);
     
      Dvector & operator+= (const Dvector & vect);
    erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dvector.cpp: In member function ‘Dvector& Dvector::operator+=(const Dvector&)’:
    Dvector.cpp:101: error: assignment of read-only location ‘((Dvector*)V)->Dvector::operator()(i)
    à cause de V(i) += vect.v[i];

Discussions similaires

  1. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  2. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15
  3. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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