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 :

surcharge operator[] problème type retour


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Points : 23
    Points
    23
    Par défaut surcharge operator[] problème type retour
    Bonjour,

    J'écris un programme dans lequel j'ai une classe image template qui contient un pointeur vers un vecteur de T. Je voudrais surcharger l’opérateur [] mais je n'arrive pas à compiler.


    classe Image
    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
     
    template<typename T>
    class Image
    {
    public:
        Image(vector<T> &data, size_t width, size_t height, size_t depth);
        ~Image();
     
        vector<size_t> getSize() const {return m_size;}
     
         T& operator[](size_t const index) {return this->m_data[index];}
         T  operator[](size_t const index) const {return this->m_data[index];}
     
    private:
        vector<T> *m_data;
        vector<size_t> m_size;
    Je fais appel à l'opérateur [] dans une autre classe lorsque je veux lire/modifier la valeur:

    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
     
    template<typename T>
    bool ConvFilter<T>::applyTo(Image::Image<T>& dest, const Image::Image<T> &src)
    {
        if (dest.getSize() != src.getSize())
        {
            cerr << "input and output Images have not the same size" << endl;
            return false;
        }
     
        vector<size_t> size = src.getSize();
     
        for (size_t k=0,index=0; k<size[2]; ++k)
            for ( size_t j=0; j<size[1]; ++j )
                for ( size_t i=0; i<size[0]; ++i, ++index)
                    cout << src[index] << endl;
    Lors de l'appel à l'opérateur ligne16, ça va chercher l'opérateur ligne 12 de Image et ça me met:

    Y:\programs\normalisationPIXEbySTIM\src\Image\Image.hpp:23(=ligne 12): erreur : cannot convert 'std::vector<float>' to 'float' in return
    Pourtant il me semble que tel que je l'ai écris ma surcharge renvoie un Tet pas un vecto<T> non?

  2. #2
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour,

    Retourne un vector<T> et non pas un float car ton m_data est un pointeur, or si tu y accèdes de cette façon cela veux dire que tu accèdes à l'élément "index" de ton pointeur.
    cf: arithmétique des pointeurs.
    donc la réponse est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->(*m_data)[index];
    Mais tu devrait t'assurer de pas faire un out of bound...

    Cordialement,
    Homer J. Simpson


  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Points : 23
    Points
    23
    Par défaut
    Merci pour ta réponse,

    je comprends mieux maintenant.


    Mais tu devrait t'assurer de pas faire un out of bound...
    Je préfère garder le comportement de l'operateur[] pour être un peu plus rapide. Il faudra juste faire attention

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    pourquoi faire un retour par copie dans le cas de la version const ?
    Les const reférences sont là pour ça.
    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
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Image(vector<T> &data, size_t width, size_t height, size_t depth);
    ...
    vector<T> *m_data;
    C'est vachement suspect, ça. J'espère que ce n'est pas ce dont ça a l'air...
    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.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Points : 23
    Points
    23
    Par défaut
    Je vais sans doute poser une question bête mais :
    C'est vachement suspect, ça. J'espère que ce n'est pas ce dont ça a l'air...
    ça a l'air de quoi?

    dans mon constructeur je fais :

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est bien là le problème.
    La variable donnée en référence peut ne plus exister et donc ton pointeur pointerait sur n'importe quoi…
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par leternel Voir le message
    C'est bien là le problème.
    La variable donnée en référence peut ne plus exister et donc ton pointeur pointerait sur n'importe quoi…
    Ha ok. Mais je m'assure que les données "ratachées" à data existe le temps dont j'en ai besoin. En fait je m'étais dit que comme les images que je traite sont susceptible d'être grosse, je ne voulais pas les passer en copie.

    Par contre si il y un meilleur moyen je suis preneur :-)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est extrêmement sale, car une référence et un pointeur ont des sémantiques différentes pour l'utilisateur (connotations différentes au sujet de la durée de vie, etc.). Si ta classe mémorise un pointeur vers les data, son constructeur doit prendre directement en paramètre un pointeur vers les data.

    L'alternative, c'est de mémoriser directement une référence dans la classe:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Image(vector<T> &data, size_t width, size_t height, size_t depth);
    ...
    vector<T> &m_data;
     
    ...
     
    Image::Image(vector<T> &data, size_t width, size_t height, size_t depth)
     : m_data(data)
    {
    	...
    }
    La décision est à prendre selon la durée de vie que tu attends de la classe Image, compte tenu des traditions de la programmation qui assurent une bonne compréhension du code.
    • Si ton Image a vocation à être temporaire, allouée sur la pile, je conseille la référence de bout en bout.
    • Si ton image a vocation à vivre plus longtemps que la fonction qui la crée, allouée sur le tas, je te conseille le pointeur de bout en bout.
    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.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    De plus, la durée de vie des données d'une image est, typiquement, celle de l'image elle-même :

    Même si l'on peut envisager de les charger (d'une manière ou d'une autre) avant de créer l'image, elles seront, a priori, créées et détruites en même temps que l'image.

    Chaque image devenant responsable de la durée de vie de ses propres données, cela facilite énormément le reste car il "suffit" de décider qu'une image n'est plus nécessaire pour que "tout ce qui s'y rattache" soit supprimé correctement, sans risquer qu'une image ne dispose plus des données dont elle a besoin ni que, pour une raison ou une autre, nous nous retrouvions à maintenir "quelque part" des données qui ne sont plus utilisées par aucune image
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. surcharge operateur = avec type strucutre en retour
    Par krossark dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2010, 10h26
  2. probléme surcharge operator+
    Par digofwall dans le forum Langage
    Réponses: 5
    Dernier message: 02/11/2009, 14h35
  3. [Surcharge d'opérateurs] Type de retour
    Par Nanoc dans le forum C++
    Réponses: 10
    Dernier message: 28/11/2008, 18h48
  4. problème surcharge operator= C++
    Par cyberlulu dans le forum C++
    Réponses: 9
    Dernier message: 27/06/2008, 11h28
  5. problème surcharge operator+ (UNIX)
    Par richard_sraing dans le forum Linux
    Réponses: 9
    Dernier message: 01/12/2006, 20h41

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