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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    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,

  3. #3
    Membre averti
    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
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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 averti
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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…

  8. #8
    Membre averti
    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
    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 :-)

+ 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