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 :

opérateur, redéfinir la priorité


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut opérateur, redéfinir la priorité
    boujour,

    j'ai fait une class array qui a un opérateur + qui lui permet d'ajouter un élément a droite ou a gauche, le problème c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    array a;
    a = a+1;  // marche trés bien
    a = 1+a;  // idem
    a = 1+2+a; // problème, 1+2 est calculé en premier
                     // cette ligne éqivaut donc a la suivante:
    a = 3+a;
    a = 1+(2+a);  // de cette manière le résultat obtenu est le bon
                         // mais c'e'st franchement pas top :(
    alors je voulai savoir si il est possible de dire qu'un opérateur (ex : array operator+(const array&, const int&) soit prioritaire sur celui sur les entiers

    je suis pas sur que ce soit possible mais bon ça serai vraiment bien

  2. #2
    tut
    tut est déconnecté
    Membre éclairé
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par défaut
    je ne suis pas sûr que ce soit possible d'une part, et je ne suis pas sûr du tout que ce soit une bonne idée : pense aux utilisateurs hypothétique de ta classe qui se demanderont pourquoi la priorité des opérateurs n'est pas respectée...

  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
    Par défaut
    Non ce n'est pas possible, c'est pour cela qu'en plus de choisir nos opérateurs "logiquement", on les choisit aussi de sorte qu'ils respectent leur priorité (exemple classique : le & pour le produit vectoriel est en fait une grosse erreur).

    A la limite tu peux surcharger << pour injecter des valeurs dans une liste.

    Et pourquoi pas std::vector ou std::list ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Par défaut
    On ne peut pas changer l'ordre de priorité des opérateurs. Mais on peut utiliser des parenthèses pour effectuer certaines opérations avant d'autres comme tu l'as fait dans ta dernière ligne.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    @axile: je sais qu'avec les parenhèses ça marche, mais c'est super pratique :s, c'est justement le pourquoi de ma question

    @Loulou24 : et si j'utilise << ou >>, je pourrai faire qqch comme ça? :
    sinon, je peut pas utiliser la std, je fait programme qui doit tourner sur une calculatrice (classpas300) et je pense pas que cette librairie existe pour la calculette (je ne peu même pas utiliser 'iostream' 'math.h', etc... la seule que je puisse utiliser est "classpad.h"

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    La priorité des opérateurs est définit entre les opérateurs :
    le + est prioritaire au * (ou l'inverse, je ne sais plus trop)
    Le typage n'a rien à voir.

    L'opérateur + est en théorie commutatif; ce qui n'est pas le cas de ta redéfinition.
    Je ne qualifirait donc pas ton choix de judicieux.

    Et je m'associe à tut pour dir que la surcharge d'opérateur peut, si elle est mal utilisé, nuire considérablement à la lisbilité/compréhension du code.
    Je ne dis pas ça pour toi; ce que tu veux faire reste assez logique,
    mais j'ai déjà vu l'exemple d'un programmeur qui s'amusait à redéfinire les parenthèses et là ça devient fantasmagorique.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    c'est vrai j'avais pas pensé que le + devai par logique être commutatif aussi je vais utilisé << et >> à la place

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Citation Envoyé par narkhor
    @axile: je sais qu'avec les parenhèses ça marche, mais c'est super pratique :s, c'est justement le pourquoi de ma question

    @Loulou24 : et si j'utilise << ou >>, je pourrai faire qqch comme ça? :
    C'est vrai que c'est tout de suite beaucoup plus clair que des parenthèses

  9. #9
    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
    Par défaut
    Citation Envoyé par narkhor
    @Loulou24 : et si j'utilise << ou >>, je pourrai faire qqch comme ça? :
    Non. Là il faudrait définir >> entre deux entiers, ce que tu ne peux pas faire.
    Personnellement j'aurais juste fait ça (ça me parait de toute façon plus clair...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a << 1 << 2 << 3 << 24;
    Tu peux aussi faire des trucs plus bizarres du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.inserer(1)(2)(3)(24);

  10. #10
    Membre habitué
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Par défaut
    Citation Envoyé par narkhor
    sinon, je peut pas utiliser la std, je fait programme qui doit tourner sur une calculatrice (classpas300) et je pense pas que cette librairie existe pour la calculette (je ne peu même pas utiliser 'iostream' 'math.h', etc... la seule que je puisse utiliser est "classpad.h"
    Ton compilateur supporte-t-il toute la specification du standard? Si oui alors il est certainement possible de trouver des codes prêts à l'utilisation. La plus grande partie de la bibliothèque standarde n'utilise que du C++ standard et ne depend de rien d'autre. Tu pourrais peut-être utiliser
    http://www.sgi.com/tech/stl/download.html
    ou essayer STLport.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    voila, j'y est regardé un peu mais... et oui, y'a encore un problème:si je fait ça : ça marche
    par contre, [1>>2>>3>>mon_tableau;[/code] ne marche pas, ceci est exécuté comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (1>>2)>>3)>>mon_tableau;
    je ne sais pas ce que fait l'opérateur >> mais bon, la n'est pas le problème, je voudrai savoir s'il existe un opérateur qui serai approprié, c'est à dire que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1 op 2 op 3 op mon_tableau;
    soit équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1 op (2 op (3 op mon_tableau));
    ou op est l'opérateur.


    @ben04: j'ai déjà essayé et ça marche pô
    j'ai demander a qqn de chez casio et il m'ont dit que y'a vraiment pas moyen...

    et puis une petite question, je souhiate initialiser un tableau à la création de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array mon_tableau = {1,2,3};
    quelle doit être le prototype de mon constructeur (parce que si je met juste array(int[]) je sais pas combien il y a d'élément


    merci d'avance

  12. #12
    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
    Par défaut
    Pour l'opérateur qui soit associatif droit... Feuilllette un cours de C++ qui decrit les opérateurs, tu en trouveras surement un. Là j'ai pas trop le temps d'y réflechir, mais je pense qu'il en existe. Par contre je doute de l'utilité d'une telle syntaxe. Tu te prends la tête pour pas grand chose non ?

    quelle doit être le prototype de mon constructeur (parce que si je met juste array(int[]) je sais pas combien il y a d'élément
    Soit tu connais la taille de tes tableaux (disons N) et dans ce cas tu peux prendre un int array[N] en paramètre, soit tu dois passer la taille en paramètre avec le tableau. A noter que si tu n'utilises que des tableaux statiques, il y a une manip à base de template qui peut détecter pour toi la taille. Plutôt pratique pour ne pas se la trimballer.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    arf, peut-être bien que je me prend la t^te pour pas grand chose...
    je suis a la fac, et j'ai eut des cours sur la récursivité et on a programmé ça en CAML, et maintenant j'aurai besoin d'outils de CAML pour faire des prog C++ et du coup j'essai de les 'cloner' (je sais que je ferai pas aussi bien mais bon...)

    PS: pas de template avec ce compilo je suis dégouté, j'avais fait mon truc templatisé en C++ 'normal' compilé avec gcc et quand j'ai voulu essayé l'uatre compilo ça marche pô ==> j'été vert

Discussions similaires

  1. [OCaml & F#] Priorité des opérateurs
    Par SpiceGuid dans le forum Caml
    Réponses: 7
    Dernier message: 01/01/2008, 15h00
  2. priorité des opérateurs
    Par new_wave dans le forum SQL
    Réponses: 13
    Dernier message: 08/11/2007, 21h44
  3. Priorité des opérateurs
    Par neuromencien dans le forum Langage
    Réponses: 3
    Dernier message: 14/05/2007, 17h06
  4. Réponses: 3
    Dernier message: 31/08/2006, 10h39
  5. Réponses: 24
    Dernier message: 08/05/2006, 23h12

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