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 :

[Template] Surcharge operateur


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut [Template] Surcharge operateur
    bonjour

    J'ai un petit probleme dans un bout de code je vois cette ligne :

    dans une class SharePtr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<class U> operator SharePtr<U>{
           return(U*)ptr;
    }
     
    template<class U> operator U*(){
           return(U*)ptr;
    }
    La class SharePtr a une variable ptr;

    ce qui me pose problème c'est l'opérateur surchargé je pensais qu'il n'y avait que = + - * / etc ... mais la j'ai du mal. Auriez vous une explication et/ou un exemple simple
    Merci

  2. #2
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Tu est sur qu'il ne manques pas des () :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template<class U> operator SharePtr<U>(){
    return(U*)ptr;
    }
    ???


    Je penses (mais je ne suis pas sur) qu'il s'agit de l'opérateur de cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DerivatedPtr<int> obj;
    SharePtr<int> &ref = (SharePtr<int>) obj;

  3. #3
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce sont des opérateurs de conversion implicite. Si tu définis un C::operator X, tu pourras affecter une instance de ta classe C à une variable de type X sans faire la moindre conversion explicite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class C
    {
    public :
        operator int() {return x;}
     
    private :
        int x;
    };
     
    C c;
    int xx = c;
    Dans ce contexte, ce sont des opérateurs qui permettent de convertir implicitement un pointeur intelligent vers un type compatible (SharePtr<Derivee> en Base*) ou vers un pointeur intelligent de type compatible (SharePtr<Derivee> en SharePtr<Base> par exemple).
    Ici c'est pas très malin car il n'y a absolument aucune restriction à la conversion, je pourrais convertir un SharePtr<Citron> en Pomme*.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    tu as raison j'ai oublié les parenthéses apres <U>, par contre ca me faisait pensait au constructeur de base sans paramètre dans les deux cas mais bon juste la tete que ca avait. Operateur de cast humhum cela reste un mystere et a quoi ca pourrait bien servir dans ce contexe vu que des parenthése (type*) suffirait

    merci quand meme pour la reponse..

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Cela s'appelle un opérateur de conversion. La syntaxe de déclaration est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A
    {
      operator T();
    }
    où T est un type quelconque. Note que contrairement aux autres opérateurs, il ne faut pas indiquer de type de retour, le type de retour est celui indiqué après le mot clé "operator".

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    a oui la je commence a entrevoir un peu le bout du tunnel faut que je me plonge un peu plus dans le code pour voir mais ton exemple est tres claire merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    a oui merci pour vos réponses je pense avoir compris, juste des conversions implicites pour pointer sur la variable ptr avec un objet a la base style Shareptr<Queueitem> renvoi un pointeur de type Queueitem->ptr

  8. #8
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Oui c'est presque ça.

    Ce que tu décris, ça serait plus la surcharge de l'opérateur ->

    Un exemple précis t'as été donné plus haut :

    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
    class C {
      public:
        void f() {
          printf("Hello world !");
        }
    };
     
    SharePtr<C> p;
     
    // Sucharge de ->
    p->f();
     
    // Surcharge de T() (conversion implicite)
    C c = p;
     
    c.f();
    Tu vois la différence entre les 2 surcharges ?

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

Discussions similaires

  1. Template, et operateur surchargés !
    Par DakM dans le forum Langage
    Réponses: 14
    Dernier message: 17/11/2011, 17h23
  2. Réponses: 4
    Dernier message: 27/10/2008, 17h53
  3. Réponses: 22
    Dernier message: 17/07/2008, 09h51
  4. souci classe template et surcharge operateur
    Par loicounet dans le forum Langage
    Réponses: 8
    Dernier message: 28/04/2008, 15h01
  5. Optimisation Listechainé avec template et operateur surchargé.
    Par Alain Defrance dans le forum Langage
    Réponses: 8
    Dernier message: 29/12/2007, 18h25

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