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

Langage C++ Discussion :

Comment empêcher plusieurs instanciation d'une classe (à la compilation) ?


Sujet :

Langage C++

  1. #21
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par RPGamer Voir le message
    Si il n'y a aucun empêchement, alors il s'agit d'une erreur de conception car la valeur de qApp et celle de retour de QApplication::instance() seront indéterminées à l'exécution.
    Nope. Tu peux dire que c’est une erreur d’implémentation si tu y tiens, mais certainement pas de conception. Le contrat te dit :
    * tu dois créer une et une seule instance de QApplication
    * tu choisis délibérément de faire autre chose, ça te pète à la gueule, c’est de *ta* faute, et uniquement de la tienne car tu n’as pas respecté le contrat.

    Après, quand c’est possible, on aime bien forcer les gens à respecter les contrats plutôt que ça leur pète à la gueule, c’est généralement ce qui fait un code robuste . Mais c’est important de bien déterminer les responsabilités et de ne pas accuser un innocent.

  2. #22
    Membre expérimenté

    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
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par RPGamer Voir le message
    Si il n'y a aucun empêchement, alors il s'agit d'une erreur de conception car la valeur de qApp et celle de retour de QApplication::instance() seront indéterminées à l'exécution.
    Je ne penses pas que l'on puisse parler d'erreur de conception comme conséquence inévitable d'un "s"il n'y a aucun empêchement". Il s'agit peut-être d'un état indéterminé suite au non respect par l'utilisateur d'une précondition, si précisé comme suit dans la doc. Il s'agit ici plus d'une philosophie (empêcher l'utilisateur de faire des bêtises ou juste prévenir l'utilisateur ou juste ne pas déterminer les mauvaises utilisations). Ceci ne veut pas dire que tu as tord dans la finalité, juste que ton raccourci n'est pas correct.

    C'est la balise QUOTE pour les citations, pas CODE
    Citation Envoyé par RPGamer Voir le message
    Pas vraiment. Une interface ne possède que des signatures de méthodes en Java (pas d'implémentation et donc pas d'attributs) à la différence de la classe abstraite qui elle n'est tout simplement pas complétement implémentée (donc pas instanciable non plus). Le pattern que j'utilise est "fréquent" en Java car l'API native est plus riche en Java qu'en C++ mais il ne s'agit pas d'une particularité de ce langage donc je ne cherche pas à tout prix à reproduite le schéma de Runnable.
    Je ne disais pas qu'une interface Java = classe abstraite C++, je disais que si tu souhaites forcer l'utilisateur à implémenter des méthodes, alors cf. ce que j'ai dit. Pour ce qui est du Runnable, je n'ai pas dit que c'est ce que tu cherchais à tout prix . Mais j'ai cru lire que tu cherchais à faire une classe non instanciable obligeant à coder une fonction run(), j'ai donc imaginé que tu puisait ton inspiration de la classe Runnable.

    Je reste également persuadé que ce que tu souhaites est faisable à la compilation. A condition d'avoir bien posé le problème ou la problématique
    Nullius in verba

  3. #23
    Membre averti Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Points : 395
    Points
    395
    Par défaut
    En principe la valeur de retour d'une fonction ne doit jamais être indéterminée à l'exécution. Cette règle s'applique, pour des raison évidentes de fiabilité, quelle que soit la situation, d'où ma remarque.

    Pour en revenir au sujet, je ne pense pas qu'il soit possible aisément de détecter ce genre de mauvaise utilisation à la compilation car il faudrait une directive de précompilation capable de déclarer une règle de compilation, ce qui, à ma connaissance, n'existe pas.

    La seule idée qui me vient en tête serait de remplacer le constructeur par une macro. Mais ca parait casse-gueule.

  4. #24
    Membre éclairé

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Dans QCoreApplication, c'est un simple pointeur statique (comme dans un singleton), avec un assert pour vérifier que la classe n'est pas instanciée plusieurs fois. Aucun mécanisme de vérification a la compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class K {
    public:
      K() : p_(0) {
        assert(!p_);
      }
     
      static K* instance() { 
        assert(p_);
        return p_;
      }
     
    private:
      static K* p_;
    };

  5. #25
    Membre averti Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Points : 395
    Points
    395
    Par défaut
    OK c'est ce qui paraissait le plus probable. Dans mon code je remplace juste assert() par une exception dédiée.

    Merci pour vos interventions.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/07/2015, 20h45
  2. Comment créer plusieur instance d'une class
    Par zyaya dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/12/2010, 14h01
  3. Comment empêcher l'historisation d'une ou plusieurs commandes ?
    Par hisoft dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 27/04/2010, 15h11
  4. Réponses: 2
    Dernier message: 13/04/2010, 12h45
  5. Comment savoir avec quel JDK une classe est compilé
    Par menzlitsh dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2009, 17h21

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