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 :

une question à propos de la FAQ ( fonctionnement des tests d'ouverture de fichier )


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut une question à propos de la FAQ ( fonctionnement des tests d'ouverture de fichier )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    operator void*() const;
    c'est implementé comment en fait? ( quelle valeur de retour en cas de succès? )

    si c'est un truc du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return this->open() ? this : 0;
    la signature ne serait-elle pas du coup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    operator const void*() const;
    en fait?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    c'est un opérateur de conversion vers void*
    Donc non

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    Je me demandais juste comment était l'implémentation en fait

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    Je me demandais juste comment était l'implémentation en fait
    Ben ça dépend de toi??
    J'ai peut être pas compris ta question

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    Je parlais de la FAQ où il y a un article sur les file streams et la méthode operator void*() qui est héritée de ios.

    avec la signature:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    operator void*() const
    si je l'implémente juste avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return condition ? this : 0;
    mon compilo n'en veut pas, par contre il le veut bien avec la signature operator const void*() const. ( et c'est logique non? )

    alors je me demandais comment ios l'implementait pour avoir cette signature, qu'est ce qu'il renvoyait ( autre chose que this? (void*) this ? )

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ha ok.
    Je sais pas alors

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    alors je me demandais comment ios l'implementait pour avoir cette signature, qu'est ce qu'il renvoyait ( autre chose que this? (void*) this ? )
    Ce qu'il veut. Ce n'est pas specifie. La seule chose que tu peux faire avec le resultat, c'est de comparer avec NULL.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    on a un changement de comportement dans certains cas si on utilise la version qui renvoie un const void*?

    C'est juste que je voulais implémenter ce comportement sur une de mes classes.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Hello nikko34,

    Question intéressante. En fait, ce n'est pas un opérateur de conversion à proprement parler, mais plutôt un "hack" pour pouvoir tester le flux dans un "if" par exemple.

    Le choix intuitif aurait été de proposer un operator bool(), mais cela pose quelques problèmes. Tout à coup, tu peux écrire des choses comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    fstream f;
    f << 1;
    f++;
    int valeur = f;
    Tout cela à cause des conversions implicites entre bool et d'autres types fondamentaux comme int et des opérateurs définis pour bool.

    L'utilisation de "void*" empêche ce genre d'opérations, car on ne peut pas opérer sur un pointeur vers void, étant donné que, par définition, void n'a pas de taille ("void" en anglais signifie "vide", "inexistant").

    Donc en fait, tu es libre de renvoyer n'importe quelle valeur, même reinterpret_cast<void*>(1).

    Si tu veux en savoir plus sur le sujet: The Safe Bool Idiom

    !Carl

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    ok, très intéressant merci. Effectivement le problème que j'avais vu est le coup du delete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::ofstream f;
    delete f;
    ça marche...enfin ça compile avec un warning.

    dans son exemple il indique bien comme première implémentation bête et méchante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    operator void*() const {
        return ok_==true ? this : 0;
      }
    mais mon gcc n'en veut pas si le retour n'est pas const.

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    ok, très intéressant merci. Effectivement le problème que j'avais vu est le coup du delete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::ofstream f;
    delete f;
    ça marche...enfin ça compile avec un warning.
    Sauf que vouloir libérer dynamiquement la mémoire allouée sur le tas, ca ne me parrait clairement pas être une bonne idée
    dans son exemple il indique bien comme première implémentation bête et méchante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    operator void*() const {
        return ok_==true ? this : 0;
      }
    mais mon gcc n'en veut pas si le retour n'est pas const.
    En fait, j'ai déjà remarqué que Gcc appréciait particulièrement les retour constant sur méthodes constante.

    D'autant plus que dans cette méthode, this est constant (du fait que la méthode s'engage à ne rien modifier, cela inclu this aussi), et que tu essaye de renvoyer un pointeur non constant, ce qui a des chances de ne pas plaire

    Mais rien ne t'empêche d'écrire une méhtode non constante et une autre constante

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Sauf que vouloir libérer dynamiquement la mémoire allouée sur le tas, ca ne me parrait clairement pas être une bonne idée
    oui j'aurais du mettre une balise <ATTENTION LES ENFANTS IL NE FAUT PAS FAIRE CA CHEZ VOUS!!>

    mais tu peux le compiler (avec un warning) et l'exécuter.

    contrairement à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string s;
    delete s;
    qui ne compilera pas.

    Mais rien ne t'empêche d'écrire une méhtode non constante et une autre constante
    comme je veux juste le comportement
    if( maclasse ) {..}, on va dire que ça ira

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Sauf que vouloir libérer dynamiquement la mémoire allouée sur le tas, ca ne me parrait clairement pas être une bonne idée
    Tu veux dire la pile, non ?

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu veux dire la pile, non ?
    Oui, j'étais un peu distrait

  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Si je comprends bien le problème:
    - tu veux une classe qui retourne un opérateur qui te permette d'écrire "if (instance)"
    - tu ne veux pas pouvoir écrire "delete instance;" par mégarde.

    Je suppose qu'il y a déjà tout ce qu'il faut dans le lien précédemment donné au sujet des safe-bools. Perso, j'ai un fichier-template (squelette) qui me permet d'écrire ce genre de choses:
    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
    class Test1
    {
    public:
        struct boolean{ int i;};
        /** Is the data «valid» ?.
         * 
         * Hack to provide a boolean operator that is convertible only to a
         * boolean expression to be used in \c if tests.
         * @see <em>Imperfect C++</em>, Matthew Wilson, Addisson-Welsey, §24.6
         * «@since »
         */
        operator int boolean ::* () const {
    	return true ? &boolean::i : 0;
        }
    };
     
    int main (int argc, char **argv)
    {
        Test1 t;
        if (t) {
    	delete t;
        }
    }
    // Vim: let $CPPFLAGS='-Wall -pedantic'
    GCC 3.4.4 me jette, VC 2008 aussi, mais mon vieux Sun CC compile sans broncher.

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Code C++? : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    operator int boolean ::* () const {
    	return true ? &boolean::i : 0;
        }
    Je ne comprends absolument pas cette déclaration...

  17. #17
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Elle retourne un pointeur sur une donnée membre de type entier. Dans un cas, c'est un pointeur valide qui est retourné (convertible en true), dans l'autre cas, le pointeur nul (convertible en false). Je pense que le "true ?" est la partie à remplacer pas "monTest() ?".

  18. #18
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    true est à remplacer par un vrai test.

    Le même genre de hack est utilisé en métaprog pour tester si un parametre template est un type primitif ou une classe évoluée.

    Qu'est ce qui ne compile pas Luc ? Chez moi pas de souci.

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Qu'est ce qui ne compile pas Luc ? Chez moi pas de souci.
    j'imagine que c'est le delete ensuite qui ne compile pas ( et c'est le comportement qu'on attend ).

  20. #20
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Oh, bien sur... j'avais mal saisi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Question à propos de la STL et des exceptions
    Par teddyalbina dans le forum Langage
    Réponses: 4
    Dernier message: 11/06/2011, 00h24
  2. Réponses: 4
    Dernier message: 20/10/2010, 19h56
  3. Une question à propos du mobilité
    Par guarwawa dans le forum VB.NET
    Réponses: 1
    Dernier message: 21/02/2008, 08h30
  4. Encore une question à propos des jar & du classpath
    Par ®om dans le forum Général Java
    Réponses: 4
    Dernier message: 19/07/2007, 13h46
  5. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03

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