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 :

Explicit, nombres et static_cast


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut Explicit, nombres et static_cast
    Bonjour.

    Je me retrouve confronté à un problème utilisateur mineur, mais toutefois dérangeant:

    j'ai défini une classe comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
    public:
       A(unsigned int a);
       ...
     
    private:
       explicit A(int a);
    };
    le constructeur en private me sert en effet à construire un objet de manière plus optimale qu'avec le constructeur public (qui fait un certains nombre de vérifications.).

    Le problème est que du coup, si je déclare un objet, le codeme renvoie une erreur puisque 26 est considéré comme un int et non un unsigned, et que le constructeur sur int est private.

    Je suis alors obligé de construire mes objets comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A objet(static_cast<unsigned int>(26));
    ce qui est quand même un peu lourd...


    J'en viens donc à ma question: Comment faire en sorte que le constructeur public accepte des ints positifs sans pour autant se débarasser du constructeur private....


    si vous avez une idée...


    Merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  2. #2
    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
    Le u sert à dire que l'entier est "unsigned".

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Ou changer d'architecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ABase
    {
    protected:
       ABase(int a);
    };
     
    class A : public ABase
    {
    public:
       A(unsigned int a);
    };

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Ou changer d'architecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ABase
    {
    protected:
       ABase(int a);
    };
     
    class A : public ABase
    {
    public:
       A(unsigned int a);
    };
    J'aime bien cette syntaxe qui est élégante, mais il faudrais recopier dans A toutes les méthodes de Abase(ou l'inverse), et j'en reviens toujours à cette question de surcoût dû à la présence d'une classe héritée...

    D'autre part, je me demande si en appelant le constructeur de A, le constructeur par défaut de ABase n'est pas appelé... bref, bien des questions en somme.

    En attendant des éclaircissements

    cordialement
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    J'aime bien cette syntaxe qui est élégante, mais il faudrais recopier dans A toutes les méthodes de Abase(ou l'inverse)
    Non pas besoin, toutes les fonctions de ABase sont accessible dans A, c'est un des principe de l'héritage.

    et j'en reviens toujours à cette question de surcoût dû à la présence d'une classe héritée...
    Si tu parle de surcout à l'exécution, dans un tel cas (pas de fonction virtuelle), il ne devrait en avoir aucun, ni en terme de mémoire ni en terme de vitesse.

    D'autre part, je me demande si en appelant le constructeur de A, le constructeur par défaut de ABase n'est pas appelé...
    Oui forcement, sauf si tu indique au compilateur d'en utiliser un autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A : public ABase
    {
    public:
       A(unsigned int a)
       : ABase(a)
       {
          // vérifications supplémentaires
       }
    };

Discussions similaires

  1. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  2. nombre aleatoire
    Par Bob dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 17/06/2002, 18h12
  3. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31
  4. Nombre de fichiers ouverts simultanément
    Par matrixfan dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2002, 17h47
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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