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 :

Constructeur avec un string par défaut.


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Constructeur avec un string par défaut.
    Bonjour

    J'ai une question simple

    J'ai un constructeur qui prend comme argument par défaut un string.
    Quand je fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CTOR (...., const std::string& bondmnemonic="");
    puis implémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CTOR (...., const std::string& bondmnemonic)
    ca passe.
    Mais quand je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CTOR (...., std::string& bondmnemonic="");
    puis implémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CTOR (...., std::string& bondmnemonic)
    ce me renvoie comme erreur:

    error C2440: 'default argument' : cannot convert from 'const char [1]' to 'std::string &'

    Il n'existe pas de constructeur de string non qui peuvent etre construit avec ""?

    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Et avec ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CTOR (...., std::string& bondmnemonic=std::string())
    (je n'ai pas testé)

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    hmm pas idiot comme idée
    je vais tester

  4. #4
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Si tu prends une référence non constante, c'est que tu comptes modifier la valeur passée en argument.
    Dès lors, quelle est la logique de mettre un argument par défaut ?

    La solution vient donc de la surcharge du constructeur, avec et sans ce dernier paramètre.

  5. #5
    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 : 50
    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
    Par défaut
    C'est normal, et pas lié aux valeurs par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void f(int const &i);
    void g(int &i)
    Tu as le droit d'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 5;
    f(i);
    g(i);
    Mais par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f(5);
    g(5); // Erreur ici, il veut une référence à une vraie variable
    Une référence constante peut référence une variable temporaire crée à partir d'une valeur, une référence non constante a besoin d'une vraie variable.
    Et bien là, c'est pareil, comme valeur par défaut, tu peux passer une valeur là où une référence constante est attendue, pas là où un référence est attendue.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Je pense que cela est tout à fait normal puisque quand tu declares (... std::string &g = "") il s'agit d'une référence non constante et une référence non constante ne peux pas être initialisée par un objet temporaire, ici ton std::string (je ne saurais pas te dire pourquoi mais je sais que cela ne marche pas )
    C'est pourquoi tu ne peux ni mettre std::string &g = "" ni std::string &g = std::string("..."), mais tu dois mettre const std::string &g = "" ou const std::string &g = std::string("...").
    Et c'est pareil pour les types de base int, double...

    Edit : grillé

  7. #7
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par Lintel-oo Voir le message
    C'est pourquoi tu ne peux ni mettre std::string &g = "" ni std::string &g = std::string("..."), mais tu dois mettre const std::string &g = "" ou const std::string &g = std::string("...").

    Edit : grillé
    Je ne penses pas que ce soit cela que dise Mr Loïc Joly. il dit que si ton constructeur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CTOR (...., const std::string& bondmnemonic="");
    //ou
    CTOR (...., std::string& bondmnemonic="");
    (d'ailleurs std::string() pour initialiser sera plus Joly )


    Dans le premier cas les variables que tu passe en paramètre peuvent ne pas avoir été définies avant.

    Dans le deuxième cas, pour que ça marche, il faut faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::string str("blabla");
    std::string& r_str = str;
     
    CTOR(..., r_str);

    (et maintenant je croise les doigts pour ne pas avoir dit de conneries )

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Kaamui Voir le message
    Je ne penses pas que ce soit cela que dise Mr Loïc Joly. il dit que si ton constructeur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CTOR (...., const std::string& bondmnemonic="");
    //ou
    CTOR (...., std::string& bondmnemonic="");
    (d'ailleurs std::string() pour initialiser sera plus Joly )


    Dans le premier cas les variables que tu passe en paramètre peuvent ne pas avoir été définies avant.

    Dans le deuxième cas, pour que ça marche, il faut faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::string str("blabla");
    std::string& r_str = str;
     
    CTOR(..., r_str);

    (et maintenant je croise les doigts pour ne pas avoir dit de conneries )
    En fait, cela revient au même...

    Le langage autorise la création d'une varialbe (anonyme) temporaire, uniquement lorsque l'argument est soit une copie, soit une référence constante.

    La raison est simple : ainsi que le dit le terme, une variable temporaire anonyme est... anonyme et temporaire

    Comme elle est anonyme, il est impossible de réutiliser cette variable par la suite dans la fonction appelante, et, comme elle est temporaire, elle est détruite dés que l'on quitte la portée de la fonction à laquelle elle est passée en paramètre ( ce qui empêche, à nouveau, d'y avoir accès depuis la fonction appelante ) .

    Il n'y a donc aucun sens à permettre qu'une référence sur une variable anonyme puisse etre modifiée dans la fonction appelante, étant donné... que toute modification apportée par la fonction sera d'office perdue

    Lorsque tu décides de fournir une valeur par défaut à un argument, c'est comme si tu disais au compilateur :
    Tu dois t'attendre à ce que l'on te fournisse un objet de type XXX, mais, si on ne t'en donne pas, tu peux utiliser un objet qui aura été initialisé de cette manière, que tu devras créer toi meme pour l'utiliser dans la fonction.
    Ce qui nous met, tu l'auras surement remarqué, exactement dans le cas d'une variable temporaire anonyme

    C'est la raison pour laquelle tu peux parfaitement écrire
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void foo(un_type const & )
    voir meme
    mais que tu ne peux fournir une valeur par défaut que pour les prototypes qui donnent l'assurance soit qu'aucune modification ne risque de devoir se répercuter dans la fonction appelante, à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void foo(un_type const &  arg=... )
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void foo(un_type  arg=... )
    Est-ce que c'est plus clair, maintenant?
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 11
    Dernier message: 13/08/2014, 00h00
  2. Ouvrir/afficher un fichier avec son logiciel par défaut
    Par Alain P. dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/06/2009, 18h47
  3. démarrer avec le systeme par défaut
    Par arti2004 dans le forum Windows XP
    Réponses: 1
    Dernier message: 15/01/2006, 15h44
  4. Problème avec les valeurs par défaut
    Par Steph Ace dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/12/2005, 09h55
  5. problème avec média player par défaut pour les vidéos ?
    Par tomguiss dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 18/10/2005, 14h08

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