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 :

Référence invalide, comment ça marche ?


Sujet :

C++

  1. #21
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Je ne suis pas pour le tout pointeur ou le tout référence.
    Je pense que les deux ont des avantages et des inconvéniants.
    Je pensais que les références n'avaient pas le désavantage de pouvoir être invalides, ce qui n'est pas le cas.
    Les deux ont des emplois différents, on ne peut pas comparer deux choses qu ine servent pas à la même chose...

  2. #22
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Les deux ont des emplois différents, on ne peut pas comparer deux choses qu ine servent pas à la même chose...
    Et pourtant pointeurs et références servent dans la quasi totalité des cas à la meme chose: passer une variable à une partie du code, sans avoir à en copier le contenu.
    C'est bien pour ça que les pointeurs sont devenus rares dans un bon code C++.

    En cas de besoin d'allocation mémoire on utilise std::vector

    Je ne vois que les cas suivants suivants où un pointeur est encore indispensable:
    - implémentation de son propre container
    - fonctions virtuelles. Certes les fonctions virtuelles marchent sur les références, mais il aura au moins fallu allouer dynamiquement la classe

  3. #23
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Comment faire une liste chainée (donc une gestion dynamique de la mémoire) avec des références ?
    C'est pas possible avec les références uniquement.
    Dès qu'on touche à de la gestion dynamique de mémoire les références ne servent plus.

  4. #24
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    effectivement, mais le cas des listes chaînées est particuliers :
    tu as besoin de pouvoir modifier ce qui est pointé par ton pointeur...

    et puis, pour les listes chaînées, il y a std::list
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #25
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Je suis d'accord, prenont un exemple incontestable :
    Si on veut faire :
    -> Un conteneur perso
    -> De l'allocation dynamique de mémoire
    -> Un design patern factory
    -> Les pointeurs de fonctions
    Ca existe pas à ma connaissance les références de fonction ???

  6. #26
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par Rafy
    Ca existe pas à ma connaissance les références de fonction ???
    Tu serais supris de savoir ce qui existe :-P
    nan... blague à part, les références de fonctions existent (j'ai été surpris aussi), mais c'est exactement la même chose qu'un pointeur de fonction... et puis les pointeurs de fonctions c'est encore autre chose...

    Et puis, de toutes façons, les pointeurs et les références ce n'est pas EXACTEMENT la même chose, il ne faut pas abuser des références, il y a des points ou les pointeurs sont nécessaires en C++...

    mais le tout est de reconnaître ceux où ils sont VRAIMENT nécessaires, de ceux où une référence serait plus correcte...

    pour te répondre

    ->dépend du conteneur
    ->soit, généralement pointeur
    ->allocation dynamique
    ->ne pas confondre pointeur et pointeur de fonction, même si on retrouve le mot pointeur, ce n'est pas du tout la même chose ^^ en plus, en C++, il vaut mieux utiliser les foncteurs que les pointeurs de fonction
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  7. #27
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Ah enfin quelqu'un qui est d'accord avec moi :
    Et puis, de toutes façons, les pointeurs et les références ce n'est pas EXACTEMENT la même chose, il ne faut pas abuser des références, il y a des points ou les pointeurs sont nécessaires en C++...

    mais le tout est de reconnaître ceux où ils sont VRAIMENT nécessaires, de ceux où une référence serait plus correcte...
    Sinon je n'était pas au courant des références de fonction.
    Un pointeur c'est une variable qui stocke l'emplacement mémoire d'une autre, alors un pointeur de fonction c'est comme un pointeur, sauf qu'il pointe sur une variable de type 'fonction'...

    Pour les foncteurs, je sais que c'est 'mieux' à utiliser, mais pour faire par exemple une CALLBACK, et ben je trouve que c'est trop. Ca fait une débauche énorme de code pour un résultat tout aussi efficace.
    Mais je reste d'accord qu'il sont mieux à utiliser, mais dans certains cas seulement. (comme les pointeurs et les références, ça dépends).

  8. #28
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par Rafy
    Sinon je n'était pas au courant des références de fonction.
    bah, ça n'apporte rien... perso, je pense qu'il vaut mieux éviter de les utiliser, ça sert à rien... pas de mofication de syntaxe, rien, puis sémantiquement, une référence de fonction c'est quoi ? pas grand chose XD
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  9. #29
    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 : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Faire un foncteur, ça prend une ligne, tout autant que pour faire une fonction, ce n'est pas un argument valide.

  10. #30
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Qui peut me parler des références de fonction ?
    J'aimerai en savoir plus... Un petit exemple pour illustrer. Merci d'avance.
    Citation Envoyé par Charlemagne
    En cas de besoin d'allocation mémoire on utilise std::vector
    Je ne vois pas trop le coup du std::vector avec l'allocation mémoire...
    Prenons un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A
    {
        public :
            A(const int i) {this->i = i;}
        protected :
            int i;
    };
    /**/
    A* pA = new A(15);
    Comment je fait pour utiliser un std::vector ????

  11. #31
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Miles
    Faire un foncteur, ça prend une ligne, tout autant que pour faire une fonction, ce n'est pas un argument valide.
    Mais c'est quand même un hack, c'est quand même pour ça que Bjarne Stroustrup veut rajouter les expressions lambda.

    Sinon je me souviens plus si ce seront des fermetures ou "closure" en anglais ? C'est à dire des fonctions qui se souviennent de leur contexte/environnement.

    Citation Envoyé par Rafy
    Qui peut me parler des références de fonction ?
    J'aimerai en savoir plus... Un petit exemple pour illustrer. Merci d'avance.
    Si j'te donne une référence vers un objet boost::function, ça compte ?
    (boost::function qui crée un foncteur à partir d'une fonction qu'on lui donne).

  12. #32
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Je ne vois pas trop le coup du std::vector avec l'allocation mémoire...
    Il s'agit tout simplement de remplacer une allocation dynamique par un std::vector.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A*pA=new A[100];
    vector<A> vec(100);
    Qui peut me parler des références de fonction ?
    J'aimerai en savoir plus... Un petit exemple pour illustrer. Merci d'avance.
    C'est effectivement pas utilisé fréquemment.
    Je crois que c'est utilisé dans la STL <fonctional> pour les fonctions "mem_fun_ref" "ptr_fun_ref" & Co. Il faudrait quand même vérifier.

  13. #33
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Pour le vector, je vois pour un tableau de A, mais si je ne veux allouer qu'un A ??? je ne vais pas utiliser un vector juste pour stocker un objet ?
    Et coté perf, c'est pas top.
    De plus si notre objet n'a pas d'opérateur de copie, c'est fichu, on ne peut le mettre dans aucun conteneur....

  14. #34
    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 : 42
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour le vector, je vois pour un tableau de A, mais si je ne veux allouer qu'un A ??? je ne vais pas utiliser un vector juste pour stocker un objet ?
    Effectivement ça n'aurait aucun intérêt, mais je pense que ce n'était pas le propos initial. Vous avez dû mal vous comprendre

  15. #35
    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 : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Dans ce cas, un petit pointeur intelligent du style shared_ptr qui permet de stocket dans des conteneurs, contrairement aux auto_ptr ?

  16. #36
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Ouais ouais c'est ce que j'utilise... Les boost::shared_ptr sont vraiment magique.... !
    L'utilisation des Week_ptr (je ne suis pas sur de l'orthographe) n'est pas très aisée... Ils sont un peu trop restrictif je touve. Je pensais au début qu'ils allaient travailler un peu comme les références, mais en fait non...

  17. #37
    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 : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    C'est weak_ptr
    Ils ne sont utiles qu'en partenariat immédiat avec des shared_ptr qui eux ont la responsabilité, contrairement aux weak_ptr qui observent seulement

  18. #38
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Charlemagne:En cas de besoin d'allocation mémoire on utilise std::vector
    Rafy: Pour le vector, je vois pour un tableau de A, mais si je ne veux allouer qu'un A ??? je ne vais pas utiliser un vector juste pour stocker un objet ?
    Et coté perf, c'est pas top.
    Je ne parlais que d'allocation mémoire de tableaux.
    N'allouer qu'un seul objet avec new n'a pas trop de sens, en général on ferait plutôt une variable locale, à moins que comme je l'ai dis plus haut:
    -on veut intégrer la classe dans l'implémentation de son propre container, par ex une liste, un arbre...
    -ou bien, on veut utiliser les fonctions virtuelles de la classe.

    Je vois pas d'autres cas ou le pointeur est indispensable, shared ou pas shared.

  19. #39
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Ben si par exemple on veut faire une gestinnaire de ressources, il faut :
    -> que les ressources soient partageable (facile avec les shared_ptr)
    -> que les ressources soient créées dynamiquement (facile avec les shared_ptr)
    et il est rare de faire des ressources copiables car elles ne passeraient pas par le gestionaire de ressources... Donc dans ce cas les shared_ptr sont presque indispensables...

  20. #40
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Un pointeur "intelligent" n'est pas un pointeur mais un container qui ressemble sur certains points à un pointeur.
    Le pointeur intelligent ne fait pas partie de la syntaxe C++.
    C'est un container bien pratique dans certains cas certes, mais pas indispensable.

    Mais effectivement une ressource est un 3ème exemple d'utilisation d'un pointeur (ou plus exactement d'une allocation mémoire), puisqu'il faut garder la ressource présente en mémoire au cours du programme.
    Le shared_ptr n"est alors qu'un outil pratique gérant la ressource mémoire, tout comme fstream gère la ressource fichier.

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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