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

Langage C++ Discussion :

Souci avec une surcharge polymorphe d'opérateur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut Souci avec une surcharge polymorphe d'opérateur
    Bonjour,

    J'ai surchargé, dans une de mes classes, l'opérateur <<, afin d'ajouter plus facilement des paramètres de divers types (une classe préparant une requête SQL, et convertissant au passage, selon leur type, les paramètres fournis, pour qu'ils soient au format attendu).

    Par exemple, une chaîne devrait être simplement concaténée, une date sera convertie en une chaîne d'un format acceptable pour la base, puis concaténée, un booléen devrait être traduit en FALSE ou TRUE, un tableau binaire pourra être "escapé" avant d'être ajouté, etc.


    La plupart de ces opérateurs fonctionnent très bien, et me donnent les résultats escomptés. Cependant, T& T::operator<<(bool b) ne marche pas. En effet, bien que l'opérateur soit présent, il semblerait que le compilateur préfère faire une conversion implicite de mon booléen en int, puis passer par mon T& T::operator<<(int i). J'ai donc des affichages, dans ma requete, de "0" au lieu de "FALSE", par exemple, ce qui est assez gênant.

    Quelqu'un aurait-il une idée de ce qui pourrait causer ce comportement ? Y'a-t'il un moyen de désactiver les conversions explicites, au moins dans ce contexte ? Ou, sinon, y'a-t'il moyen de le forcer à utiliser cette forme de la méthode, plutôt qu'une autre, de manière "simple" ?

    Parce que le but est tout de même d'écrire T << mon_bool, pas T.operator<<(mon_bool)


    Merci par avance

  2. #2
    Membre éprouvé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    Salut,

    D'abord, je voudrais savoir si tu es sûr que ton programme passe effectivement par la fonction qui prend (int i) en argument. En effet, selon la concaténation que tu fais dans la fonction qui prend (bool i) en argument, tu pourrais très bien te retrouver avec 0 ou 1 dans ta chaine, puisque ces valeurs numériques correspondent à true et false.

    Maintenant, si effectivement il y a une conversion implicite, tu peux peut-être passer outre en mettant en place une conversion explicite du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T << mon_bool, pas T.operator<<((bool)mon_bool)
    Bonne journée,

    Aldiemus

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Est-ce que ça ne passe pas par une fonction/méthode template avant l'appel à l'opérateur de sérialisation ?

    MAT.

  4. #4
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Bonjour,

    La première remarque de Aldiemus est très pertinente, commence par bien cerner l’opérateur qui est appelé (genre en mettant un std::cout << qqchose dans celui que tu t’attends à ce qu’il soit appelé).
    Ensuite, dans quel contexte est appelé cet opérateur ?
    Dans ce cas-ci :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool B=true;
    T << B;
    L’opérateur pour les bool devrait clairement être appelé.
    Mais dans le cas suivant :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    T << FonctionQuiDevraitRetournerUnBool();
    Il y a des fonction qu’on utilise comme si elle renvoyaient un bool, mais qui renvoient un int (c’est le cas de beaucoup de fonction de la bibliothèque C).
    Quel est le contexte de ton appel de cet opérateur ?
    As-tu essayé avec un appel aussi clair que le premier cas que je donne ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Nowahn : Oui, c'est bien le premier cas que j'utilise.

    Pour les autres, je manque de temps pour répondre en ce moment, mais je reviens poster ici dès que j'aurai eu le temps de me repencher sur le problème.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Il va nous falloir un peu plus de détail et de code. Car un exemple trivial fonctionne :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <iostream>
     
    struct dummy
    {
    };
     
    dummy& operator<<(dummy &d_, int i_)
    {
        std::cout<<"dummy& operator<<(dummy d_, int i_)\n";
     
        return d_;
    }
     
    dummy& operator<<(dummy &d_, bool b_)
    {
        std::cout<<"dummy& operator<<(dummy d_, bool b_)\n";
     
        return d_;
    }
     
    int main()
    {
        dummy d;
        int i(1);
        bool b(false);
        d<<i;
        d<<b;
        d<<(i==1);
    }
    Produit :
    dummy& operator<<(dummy d_, int i_)
    dummy& operator<<(dummy d_, bool b_)
    dummy& operator<<(dummy d_, bool b_)

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

Discussions similaires

  1. [WD9] [Débutant] Souci avec une simple requête
    Par unix27 dans le forum WinDev
    Réponses: 4
    Dernier message: 04/04/2006, 00h54
  2. souci avec une comparaison de date
    Par Ludo75 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 20/02/2006, 15h59
  3. [MySQL] Soucis avec une insertion dans une base
    Par Ludo75 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 27/01/2006, 14h03
  4. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34
  5. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56

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