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 :

Problème avec surcharge de l'opérateur []


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Par défaut Problème avec surcharge de l'opérateur []
    Bonjour,

    Alors voila j'ai un problème lors de la surcharge de l'opérateur [] dont l'effet est la modification je précise bien, car la surcharge de cet opérateur en consultation je l'ai faite et elle marche.

    J'ai une classe Chaine dans un fichier chaine.h et à côté mon fichier chaine.cpp.

    Lors de la compilation j'ai plusieurs lignes d'erreur qui sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    chaine.h:23: erreur: ‘Chaine& Chaine::operator[](int)’ cannot be overloaded
    chaine.h:22: erreur: with ‘char Chaine::operator[](int)’
    chaine.cpp:54: erreur: prototype for ‘Chaine& Chaine::operator[](int)’ does not match any in class ‘Chaine’
    chaine.cpp:50: erreur: candidate is: char Chaine::operator[](int)
    chaine.cpp:54: erreur: ‘Chaine& Chaine::operator[](int)’ cannot be overloaded
    chaine.cpp:50: erreur: with ‘char Chaine::operator[](int)’
    chaine.cpp: In member function ‘Chaine& Chaine::operator[](int)’:
    chaine.cpp:55: erreur: invalid initialization of reference of type ‘Chaine&’ from expression of type ‘char
    J'ai essayé de définir comme constant ma surcharge d'opérateur, et lorsque je fais cela, il ne subsiste que cette erreur là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chaine.cpp: In member function ‘Chaine& Chaine::operator[](int) const’:
    chaine.cpp:55: erreur: invalid initialization of reference of type ‘Chaine&’ from expression of type ‘char
    Voici mon code pour mieux illustrer le problème :

    chaine.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
    class Chaine{
     
    	// prototypes fonctions amies
     
    	private:
     
    		char *ch;
     
    	public:
     
    		// prototypes et/ou definitions des fonctions membres
    		inline Chaine();
    		inline Chaine(char car);
    		inline Chaine(char c[]);
    		inline Chaine(Chaine &P);
     
    		inline ~Chaine();
     
    		inline int taille() const;
    		inline void Afficher();
     
    		inline char operator [] (int indice);
    		inline Chaine & operator [] (int indice) const;  // SURCHARGE QUI POSE PROBLEME
     
    };
    chaine.cpp :

    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
    #include <iostream>
    #include <cmath>
    #include "chaine.h"
     
    using namespace std;
     
    int main() {
     
    	Chaine c1("Bonjour");
    	Chaine c2(c1);
    	c1.Afficher();
    	cout << c1.taille() << endl;
    	cout << c1[3] << endl;
     
    }
     
    inline Chaine::Chaine() {
    	ch = 0;
    }
     
    inline Chaine::Chaine(char car) {
    	ch = new char[1];
    	ch[0]=car;
    }
     
    inline Chaine::Chaine(char c[]) {
    	ch=new char[strlen(ch)+1];
    	strcpy(ch,c);
    }
     
    inline Chaine::Chaine(Chaine &P) {
    	ch=new char[strlen(P.ch)+1];
    	strcpy(ch,P.ch);
    }
     
    inline Chaine::~Chaine() {
    	if (ch) { 
    		delete []ch;
    	}
    }
     
    inline void Chaine::Afficher() {
    	cout << ch << endl;
    }
     
    inline int Chaine::taille() const {
    	return strlen(ch);
    }
     
    inline char Chaine::operator [] (int indice) {
    	return ch[indice];
    }
     
    // SURCHARGE QUI POSE PROBLEME
    inline Chaine & Chaine::operator [] (int indice) const{	
    	return ch[indice];
    }
    J'ai une petite idée d'où viendrait le problème, je pense que c'est dans le type de retour de la surcharge qui est de type char et non de type Chaine. Mais je ne vois pas comment faire autrement.

    Je vous remercie de l'aide que vous voudrez bien m'apporter

    Andréas

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est une référence sur un caractère que tu renvoies, pas sur ta classe. De plus c'est la fonction de lecture qui doit être const, pas celle qui modifie les données.
    Et à moins que tu ne supportes des opérations bizarres, le type des indices devrait au moins être non-signé. std::size_t est théoriquement le plus adapté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char operator [] (std::size_t indice) const;
    char& operator [] (std::size_t indice);

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Par défaut
    Merci, j'ai modifié mon code comme indiqué et ça fonctionne bien maintenant

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut operator[] (quel_type_ici)
    Citation Envoyé par Laurent Gomila Voir le message
    Et à moins que tu ne supportes des opérations bizarres, le type des indices devrait au moins être non-signé.
    Pourquoi?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/03/2014, 12h59
  2. Problème de surcharge d'opérateur flux avec pointeur
    Par eleve_prog dans le forum Débuter
    Réponses: 4
    Dernier message: 18/04/2011, 18h41
  3. Réponses: 4
    Dernier message: 03/03/2008, 16h57
  4. Problème de surcharge de l'opérateur <<
    Par Kr00pS dans le forum C++
    Réponses: 4
    Dernier message: 22/02/2007, 19h10
  5. Réponses: 6
    Dernier message: 12/07/2006, 15h34

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