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 :

Utilisation du constructeur implicite


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Points : 65
    Points
    65
    Par défaut Utilisation du constructeur implicite
    Bonjour,

    J'ai une classe englobant un ostringstream.

    J'aimerai utiliser le constructeur implicite pour pouvoir écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X x = "Une chaine de caractères";
    Plutôt que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X x ("Une chaine de caractères");
    (Là c'est basique mais ça peut être utile dans les passage de fonctions).

    Cette chaine devrait être stockée dans le stream.

    Hors lorsque je fais ceci, j'ai le droit à un bel avertissement :

    error: conversion from 'const char [5]' to non-scalar type 'X' requested.
    Comme si j'avais placé mon constructeur que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X (const std::string & str) { this->stream << str; }
    en explicit ...

    Est-ce ma façon de faire ou les ostringstream ne permettent-ils pas ce genre de choses ?

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    Un constructeur non explicite avec un seul paramètre sans valeur par défaut définit une conversion depuis les types des paramètres vers le type associé à la classe.

    Il faut aussi savoir qu'il ne peut y avoir qu'une seul conversion de ce genre (nommé conversion définie par l'utilisateur (*)) réalisé par le compilateur : il ne les enchaine pas.

    Or dans ton cas il doit passer de const char[5] à std::string (conversion définie par la classe std::string) puis de std::string à X : 2 conversions il ne le fait pas (3 en réalité, il y a une decay conversion de const char[5] à const char*, mais ca ne fait pas partie des user-define conversion).

    Il te faut donc rajouter un constructeur qui te permet de convertir directement depuis const char[5] (ou plutôt const char* (**))

    (*) Ca inclut aussi les conversions définient par la syntaxe operator T
    (**) On peut convertir directement depuis const char[5] sans compter sur la decay conversion avec un constructeur template, mais ca n'apporte rien ici. Et d'autre part ca restreind les possibilités d'utilisation.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Points : 65
    Points
    65
    Par défaut
    Merci pour cette réponse claire.

    J'ai ajouté un simple constructeur prenant un paramètre de type const char * mais j'ai maintenant un avertissement du compilateur comme quoi le constructeur de copie de ios_base est privé ...

    EDIT : Le problème a été résolu en ajoutant un constructeur de copie à ma classe.

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

Discussions similaires

  1. Utilisation du tContextLoad implicite
    Par DevNico dans le forum Développement de jobs
    Réponses: 6
    Dernier message: 06/05/2009, 16h40
  2. [DisplayTag] Utiliser un objet implicite recuperer à partir d'un mapping hibernate
    Par sel3aa dans le forum Taglibs
    Réponses: 3
    Dernier message: 04/02/2009, 15h05
  3. [MySQL] Utilisation de constructeur
    Par loic20h28 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/10/2008, 15h58
  4. Réponses: 5
    Dernier message: 17/04/2008, 13h22
  5. [DisplayTag] Utiliser les objets implicites
    Par starn2000 dans le forum Taglibs
    Réponses: 3
    Dernier message: 10/11/2006, 17h19

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