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 :

Empêcher une instanciation


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Empêcher une instanciation
    Hello,

    J'ai une classe parente dont la raison d'être est de factoriser l'implémentation de certains services. Je n'ai pour l'instant pas particulièrement de fonction virtuelle à définir. Et pourtant, j'aimerais empêcher l'instanciation de cette classe.

    A priori, je vois deux solutions :
    - rendre le constructeur virtuel pur
    - rendre le destructeur virtuel pur
    - définir le constructeur en protégé

    Quelle est la meilleure solution, et pourquoi ?

    Merci.

  2. #2
    screetch
    Invité(e)
    Par défaut
    constructeur protégé est a mon sens ce qui se rapproche le plus de ce que tu veux
    de plus, tu vas devoir définir un destructeur virtuelle (puisque c'est une classe de base) et tu peux aussi mettre ce destructeur en virtuel pur.

    moi je ferais le constructeur protégé.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je n'avais pas pensé au destructeur virtuel pur.

    Je le rajoute dans ma liste. :-)

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    - Constructeur virtuel: pas possible, il n'existe rien de tel.
    - Destructeur virtuel, pour une police/du code, bof. Non virtuel en protégé devrait suffire
    - Contructeur protégé, pourquoi pas aussi.
    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...

  5. #5
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    - Destructeur virtuel, pour une police/du code, bof. Non virtuel en protégé devrait suffire
    un destructeur est pas toujours, par definition, virtuel ?
    (souvenir d un bouquin, je sais plus lequel, ca montre la certitude que j en ai)
    "vaste programme"

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par BainE Voir le message
    un destructeur est pas toujours, par definition, virtuel ?
    (souvenir d un bouquin, je sais plus lequel, ca montre la certitude que j en ai)
    Non, mais il est très fortement conseillé de le rendre virtuel si tu as une fonction virtuelle dans ta classe (cf Scott Me.yers).

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Sauf s'il s'agit d'une police/de code seulement importé. Dans ce cas là, la classe mère n'est pas quelque chose auquel on peut substituer des enfants, et une destruction polymorphique n'y a pas de sens. (d'où le protégé non virtuel)
    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...

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par oodini Voir le message
    Non, mais il est très fortement conseillé de le rendre virtuel si tu as une fonction virtuelle dans ta classe (cf Scott Me.yers).
    Non.
    Il est conseillé de le rendre virtuelle si ta classe est appelée à servir en tant qu'interface, cad si tu va manipuler (et surtout détruire) des instances de classes dérivées via celle ci.

    Si ta classe utilise le NVI et qu'aucun polymorphisme n'est présent, aucune raison d'aller mettre le destructeur en virtuel.

    je crois qu'il ya une entré dans la FAQ ou si elle n'est pas présente, elle est en préparation.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le NVI est presque orthogonal à cela. Il doit pouvoir être utilisé pour définir des polices, mais je le vois plus souvent comme une super interface => cela a tout à fait du sens d'avoir un destructeur virtuel quand on a une classe contrat NVI-ienne.
    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. [POO] imposer une instanciation d'un objet
    Par zenzo dans le forum Langage
    Réponses: 5
    Dernier message: 16/03/2006, 02h08
  2. [SQL Server 2000][W2000] Empêcher une connexion
    Par Débéa dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/02/2006, 11h33
  3. Réponses: 4
    Dernier message: 07/01/2006, 19h10
  4. Empécher une fenètre MDI de se fermer
    Par vanitom dans le forum MFC
    Réponses: 6
    Dernier message: 28/11/2005, 09h21
  5. empêcher une fenêtre de perdre le focus (MDI)
    Par eponette dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2005, 16h17

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