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 :

Les pointeurs intelligents


Sujet :

C++

  1. #1
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut Les pointeurs intelligents
    Bonjour,

    Je travaille en ce moment sur un exercice de style perso qui va me permmetre je l'espère de bien comprendre l'utilisation des templates: "les pointeurs intelligents" (smart pointers).

    J'ai réalisé deux solutions:
    - Pointer-1.h
    - Pointer-2.h

    La première solution me plasait bien. Cependant je voulais qu'au niveau de la vérification du nombre d'instance à allouer tout se fasse à la compilation. C'est la raison d'exister de la deuxième solution.

    J'aurais deux petites questions concernant la deuxième solution:
    - pour éviter de pouvoir créer un Pointer<T, 0>, c'est à dire allouant 0 instance de classe T, j'ai mis le constructeur de la spécialisation corespondante en private. Je ne trouve pas ça trés propre, y aurait il une autre manière de procéder?
    - Ensuite il est impossible d'initialiser un pointeur de N instances avec un pointeur de M instance (Pointer<T, 10> p; Pointer<T, 11> p1 = p. Comment je peux faire pour que ça le soit?

    Enfin je suis preneur de tout conseil au sujet de mon implémentaion des pointeurs intelligents.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Points : 86
    Points
    86
    Par défaut
    Pour ta première question je ne sais par contre pour la seconde, je pense qu'un truc du genre devrait fonctionner:
    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
     
    template <typename T, unsigned int N=1>
    class Pointer
    {
      public:
        // ...
        template <unsigned int M>
        Pointer<T, N>& operator= (const Pointer<T, M>& e)
        {
          // Le code qui va bien pour la copie
          // ...
          return *this;
        }
        // ...
    }

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    - pour éviter de pouvoir créer un Pointer<T, 0>, c'est à dire allouant 0 instance de classe T, j'ai mis le constructeur de la spécialisation corespondante en private. Je ne trouve pas ça trés propre, y aurait il une autre manière de procéder?
    Ce n'est pas spécialement sale. Ce que tu peux faire aussi si tu utilises boost, c'est utiliser leurs assertions statiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <typename T, unsigned int N = 1>
    class Pointer
    {
        BOOST_STATIC_ASSERT(N != 0);
     
       ...
    };
    Tu peux aussi te coder un équivalent, ce n'est pas dur et c'est un bon petit exercice de méta-programmation

    - Ensuite il est impossible d'initialiser un pointeur de N instances avec un pointeur de M instance (Pointer<T, 10> p; Pointer<T, 11> p1 = p. Comment je peux faire pour que ça le soit?
    Comment gérerais-tu ça, pour qu'affecter M instances à un Pointer<T, N> reste correct ?

    Sinon concernant les pointeurs intelligents, je te conseille de lire le chapitre consacré dans Modern C++ Design d'Andrei Alexandrescu, chapitre qui est dispo en ligne si je me souviens bien.

  4. #4
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Merci pour vos réponses.

    Comment gérerais-tu ça, pour qu'affecter M instances à un Pointer<T, N> reste correct ?
    J'étais arrivé à ta solution, capitN.flam, seulement je voudrais que le fait d'initialiser un Pointer<T,N> à un Pointer<T, M> transforme ce dernier en Pointer<T, N>. C'est d'ailleurs ce qui se passe avec la première solution puisque N est alors une variable membre.

    Je me demande si c'est vraiment possible...


    Bon sur ce je vais essayer de coder les assertions statiques, je sais pas du tout comment faire, mais déjà je sais que c'est à coup de template .

    Pour info le chapitre sur les pointeurs intelligents est ici: http://www.informit.com/articles/art...=25264&redir=1

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pour les assertions statiques de Boost, j'ai un article qui va bientôt paraître à ce sujet http://miles.developpez.com/tutoriel.../staticassert/

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Bon sur ce je vais essayer de coder les assertions statiques, je sais pas du tout comment faire, mais déjà je sais que c'est à coup de template
    Le principe n'est pas compliqué : tu fais un template qui prend un booléen en paramètre, et dont la spécialisation pour false génère une erreur de compilation. Après on peut s'amuser à trouver des choses marrantes pour que l'erreur en question soit la plus explicite possible.

    seulement je voudrais que le fait d'initialiser un Pointer<T,N> à un Pointer<T, M> transforme ce dernier en Pointer<T, N>
    Pas possible, puisque Pointer<T, N> et Pointer<T, M> sont deux classes différentes ; et on ne peut bien sûr pas changer le type statique d'une variable à l'exécution.

  7. #7
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Savez vous comment on génère une erreur à la compilation?
    J'ai essayé avec #error, mais l'erreur est déclenchée à la précompilation dès que la ligne est lue.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Savez vous comment on génère une erreur à la compilation?
    En écrivant du code incorrect pardi.

    Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <>
    struct StaticCheck<false>
    {
        struct static_check_failed;
     
        static_check_failed error;
    };
    La sortie du compilo sera un truc du genre "variable 'error' uses incomplete type 'static_check_failed'".

    C'est pour cela que je te parlais de choses marrantes pour que l'erreur donnée par le compilo soit la plus explicite possible.

  9. #9
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Ha ouai d'accord , je préfères peut être la solution du constructeur privé alors

Discussions similaires

  1. Les pointeurs intelligents de Qt
    Par dourouc05 dans le forum Qt
    Réponses: 4
    Dernier message: 29/09/2009, 10h58
  2. Problème avec les pointeurs intelligents de boost.
    Par Le Barde dans le forum Boost
    Réponses: 2
    Dernier message: 05/09/2007, 12h47

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