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 :

Valeur de retour de la surcharge operator[]


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Valeur de retour de la surcharge operator[]
    Bonjour !

    Je rencontre un problème sur un code particulier, et le code minimal n'est pas plus aidant.
    Il s'agit d'une classe (ici nommée objet) ayant pour seul attribut une std::string.
    L'objectif étant de pouvoir avoir accès à un caractère de cette string via l'objet et son opérateur [] : objet.string[i] <=> objet[i]

    Seulement, l'utilisation de l'opérateur [] pose problème dans le cadre des fonctions externes à l'objet.
    En effet, si monObjet[i] marche très bien dans le main, cela n'est pas valable pour la fonction objet2str, qui tente d'employer l'opérateur [] et qui n'y arrive pas.

    compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    g++ -Wall -Werror  -c *.cpp
    objet.cpp: In function ‘std::string objet2str(const objet*)’:
    objet.cpp:41:33: error: no match foroperator+’ in ‘*(((const objet*)obj) + ((sizetype)(((long unsigned int)i) * 8ul))) + '0'
    La totalité des fichiers minimaux sont ici :
    main.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
     
    #include <iostream>
    #include <cstdlib>
    #include <fstream>
    #include <sstream>
    #include <string>
    // LOCAL MODULES
    #include "objet.h"
     
     
    int main(int argc, char* argv[]) {
            objet obj("101010");
            std::cout << obj[0] << std::endl;
     
            return EXIT_SUCCESS;
    }

    objet.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
     
    #include "objet.h"
     
    /***************************************************
     * CONSTRUCTOR
     ***************************************************/
    objet::objet(const std::string sequence) {
            value = sequence;
    }
     
    /***************************************************
     * OPERATORS
     ***************************************************/
    char objet::operator[](const unsigned int id) const {
            return value[id];
    }
     
    /***************************************************
     * OTHER FUNCTIONS 
     ***************************************************/
    /*
     * CONVERSIONS
     */
    std::string objet2str(const objet* const obj) {
            std::string str = "";
            for(unsigned int i = 0; i < obj->len(); i++) {
                    str += (obj[i])+'0'; // ERREUR
                    // Il semblerait que obj[i] renvois un objet, non un char !
            }
            return str;
    }

    objet.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
    #ifndef objet_H_INCLUDED
    #define objet_H_INCLUDED
    /*
     * LIBRARIES
     */
    // STD LIB
    #include <iostream>
    #include <cstdlib>
    #include <string>
     
    /*
     * objet CLASS
     */
    class objet {
    	public:
    	// CONSTRUCTOR
    		objet(const std::string);
    	// ACCESSORS
                    unsigned int len() const { return value.size(); }
            // OPERATORS
                    char operator[](const unsigned int) const;
    	private:
    	// ATTRIBUTES
                    std::string value; 
    };
     
    /*
     * OTHER FUNCTIONS
     */
    std::string objet2str(const objet*const);
     
    #endif

    Lorsque la ligne problématique est retirée, le main fonctionne pour ainsi dire parfaitement. (obj[0] renvois bien 1)



    En vous remerciant de votre aide.


    PS: ce code est un code minimal. Les algorithmes mis en oeuvre sont donc souvent illogiques tels quels.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Dans ta fonction, obj est un pointeur sur object. Donc, quand tu écris obj[3], il pense que ce pointeur pointe sur le premier élément d'un tableau d'objets, et que tu demandes à ce qu'il retourne le troisième élément de ce tableau.

    donc deux solutions : Soit tu écris (*obj)[i], soit tu modifie ta fonction pour qu'elle prenne en paramètre une référence à un obj, et non un pointeur (c'est probablement préférable).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup JolyLoic !

    Une erreur que j'aurais dû savoir relever moi-même...



    Surcharger l'opérateur [] pour qu'il prennent en charge les pointeurs d'objet est aussi une solution viable, non ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Non c'est impossible de surcharger pour les types de bases, et le pointeur (quel que soit la donnée pointée) est un type de base.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Effectivement, j'aurais dû réfléchir avant de poster.

    Bref, je vous remercie pour vos réponses !


    Sujet résolu !

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

Discussions similaires

  1. surcharge operator[] problème type retour
    Par -Gesicht- dans le forum C++
    Réponses: 9
    Dernier message: 13/06/2013, 02h04
  2. fonction operator, valeur de retour
    Par butch dans le forum C++
    Réponses: 21
    Dernier message: 20/09/2004, 11h30
  3. [VB6] Valeur de retour pour une Form
    Par preverse dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/08/2004, 18h16
  4. Valeur de retour d'une procédure externe
    Par elekis dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 16/04/2004, 17h45
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 14h58

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