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 :

in constructeur qui ne construirait pas


Sujet :

C++

  1. #1
    Membre confirmé

    Inscrit en
    Octobre 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 207
    Par défaut in constructeur qui ne construirait pas
    Bonjour.

    J'aimerais savoir s'il est possible qu'un constructeur, si une conditon n'est pas validée, ne crée pas l'instance ?
    Par exemple,
    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
     class Personne
    {
    public:
      ... 
      Personne()=delete; //pour ne pas utiliser le constructeur pas défaut
      Personne(std::string nom; std::string prenom);
      ...
    private:
      ...
      std::string nom;
      std::string prenom;
     ...
    }
     
    ...
    Personne personne1 {"","toto"};
    ...
    le constructeur voit que nom est vide et donc ne crée pas l'instance.

    Est-ce possible? sinon comment faut-il procéder?

    Olivier]

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 198
    Billets dans le blog
    4
    Par défaut
    Tu peux lancer une exception, ou utiliser une factory.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 327
    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 327
    Par défaut
    Note: De base, si tu définis le moindre constructeur, le constructeur dit "par défaut" (i.e. sans paramètres) n'est plus généré. Techniquement, le = delete est redondant ici.

    Tu veux interdire Personne("", "toto"), c'est ça?
    Peut-être avec de la méta-prog on peut reconnaitre le cas où tu reçois un "" vide, mais ça ne vaut que pour les littéraux, pas pour les char const* vers des "", ou même des chaines vides. Ca va vite être compliqué pour pas grand chose AMA.

    En m'inspirant de gsl::not_null<>, ça pourrait ressembler à ça: https://godbolt.org/z/6PrYMoseq -- la partie meta-prog est très certainement simplifiable (je la trouve compliquée à cause de l'ambiguité entre la référence vers tableau de caractères et le pointeur vers caractères, j'ai fait au plus rapide) ; j'exploite aussi très certainement des notions peu familières: référence vers tableau VS pointeur, require, static_assert, héritage privé, invariant garantis par construction ; et ça manque possiblement d'explicit.


    Ton type Personne serait ensuite construit à partir de 2 non_empty_string.

    Par contre... ces machins dès qu'on les déplace (tu verras ça plus tard, ou dans un autre cours post-débutant), ils ne seront plus garantis non-vides...

    Bref, la conclusion: ici des exceptions, c'est bien
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 659
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 659
    Par défaut
    comme l'écrit Bousk il faut gérer une exception.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 998
    Par défaut
    Hello,

    comme l'écrit Bousk il faut gérer une exception.
    Ah mais Bousk ne dit pas "il faut", pourquoi il faut ?

    Moi je vois plein d'autres solutions, par exemple en C++ 17 on pourrait utiliser std::optional non ?

    ou via un pointeur intelligent ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 327
    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 327
    Par défaut
    Salut,
    Citation Envoyé par fred1599 Voir le message
    Moi je vois plein d'autres solutions, par exemple en C++ 17 on pourrait utiliser std::optional non ?

    ou via un pointeur intelligent ?
    Ha! Bien vu.

    Mais... ne serait-pas une erreur de programmation dans le contexte de son désign? Du coup plutôt que d'introduire du code à vocation de traiter des erreurs de progs, quid d'une assertion des familles?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. Réponses: 13
    Dernier message: 09/01/2011, 23h33
  3. constructeur surchargée qui ne fonctionne pas
    Par kate59 dans le forum XNA/Monogame
    Réponses: 1
    Dernier message: 13/06/2008, 22h30
  4. [VB6] générer un recordset qui n'est pas lier à un bdd
    Par damyrid dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/06/2003, 17h48
  5. Réponses: 9
    Dernier message: 07/05/2003, 12h57

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