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 des fonctions d'une classe (wrapping)


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut Surcharge des fonctions d'une classe (wrapping)
    Bonjour,

    Je souhaite réaliser un wrapper autour de classe diverses.
    J'ai un soucis lors de la surcharge de "->".

    Je souhaite arriver à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Test t;
        Test *t = new Test();
        t->setName("test value");
        Wrapper<Test> *w = new Wrapper<Test>(t);
        qDebug() << w->getName();
    Mais la dernière ligne pose problème : has no member "getName".

    La ligne suivante fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDebug() << w->operator ->()->getName();
    Néanmoins, je souhaite avoir un accès normal (->) aux fonctions pour utiliser le wrapper comme si c'était la classe originale.

    Est ce une option particulière pour la compilation qui manque?


    Voici la classe wrapper:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<class T>
    class Wrapper {
    public:
        Wrapper() : _o(0) {}
        Wrapper(T* o) : _o(o) {}
        ~Wrapper() { if(_o) { delete _o; } }
     
        T& operator* () { return *_o; }
        T* operator-> () { return _o; }
     
    protected:
        T *_o;
    };
    Et la classe Test; tres simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <QString> // de Qt
     
    class Test
    {
    public:
        Test();
     
        const QString &getName();
        void setName(const QString &name);
     
    protected:
        QString m_name;
    };
    Merci pour vos éclaircissements.
    Un petit si la réponse convient. Merci.

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Wrapper<Test> *w = new Wrapper<Test>(t);
    déclare… un pointeur vers un wrapper, pas un wrapper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Wrapper<Test> w = Wrapper<Test>(t);
    Et ça fonctionnera correctement. Ton soucis est que l’opérateur -> que tu utilises n’est pas celui de Wrapper, mais celui de Wrapper*, que tu ne peux pas surcharger.

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    white_tentacle a la bonne réponse.

    Je te recommanderais d'ajouter les versions const de tes opérateurs, ça risque d'être utile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T const & operator* () const { return *_o; }
    T const * operator-> () const { return _o; }
    Find me on github

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Ok je comprends. merci.

    J'aurais préféré un pointer; je souhaitais faire un héritage avec QObject ( de Qt). Cela me semble compromis. Je vais devoir trouver une autre astuce.
    Un petit si la réponse convient. Merci.

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

Discussions similaires

  1. Recuperation de la liste des fonction d'une classe
    Par rosty38 dans le forum Général Python
    Réponses: 18
    Dernier message: 13/07/2010, 16h21
  2. Réponses: 12
    Dernier message: 30/06/2006, 17h46
  3. [VB6]Valeurs une collection renvoyée par la fonction d'une classe
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 30/03/2004, 12h04
  4. Réponses: 4
    Dernier message: 17/03/2004, 18h24
  5. Réponses: 14
    Dernier message: 15/01/2004, 02h15

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