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 :

Segmentation fault : méthode sur objet dynamique


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut Segmentation fault : méthode sur objet dynamique
    Bonjour,
    Je suis confronté a un segmentation fault dont je n'arrive pas à me défaire.
    Je sais que je ne dépasse pas la ligne 139 de mon main.cpp, qui utilise ma méthode enVie sur un Monstre et un Personnage, cependant le Monstre fonctionne mais dès que le programme passe à l'instruction suivante qui est . le seg fault arrive
    J'ai cette erreur depuis que je passe par un fichier pour initialiser mon Personnage (pour pouvoir sauvegarder mon personnage).
    Si vous changez cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*Attaque* attaque[]={new Attaque(), //Ligne 123 du main.cpp
                            new Attaque("Gros coup",150,20,2,0),
                            new Attaque("Assez gros coup",300,50,5,0),
                            new Attaque("Enorme coup",500,100,10,5)};*/
        Personnage* joueur;
        //joueur = new Personnage("Personnage",1000,1000,200,200,50,attaque,4);
     
        //Chargement du jeu
        chargerJeu(joueur, &tour);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Attaque* attaque[]={new Attaque(),
                            new Attaque("Gros coup",150,20,2,0),
                            new Attaque("Assez gros coup",300,50,5,0),
                            new Attaque("Enorme coup",500,100,10,5)};
        Personnage* joueur;
    joueur = new Personnage("Personnage",1000,1000,200,200,50,attaque,4);
     
        //Chargement du jeu
        //chargerJeu(joueur, &tour);
    vous pourrez voir que le jeu fonctionne (noramalement).

    Mon code étant composé de plusieurs fichier je l'ai mit en pièce jointe en tar.gz
    Après l'avoir téléchargé il vous suffit de le décomprésser, de faire make et de le lancer avec ./fighter

    J'ai déjà chercher sur internet mais il y a pas l'aire d'avoir de personne avec le même problème ou j'utilise les mauvais mots clef peut-être.
    Merci d'avance à la personnage qui aura le courage de comprendre ce que j'ai fait et de trouver mon(mes) erreur(s) °-°
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Avec les bons warnings de compilation, l'erreur est évidente. Sur ce dépôt se trouve des options pour gcc et clang par version de compilateur. L'idéal étant de prendre un *-debug_full_broken_abi pour le débug et toujours utiliser un fichier *-warnings. La compilation se fait avec g++ @le-fichier-choisie ...reste des options... (@ pour que le compilateur lise chaque ligne du fichier comme option de compilation).

    Ensuite, le gros problème de ton code (je ne l'ai pas regardé, juste ce que tu as posté dans ton message) est l'utilisation à tort et à travers des pointeurs et de l'allocation dynamique. Il n'y a pas de raison que Attaque soit alloué dynamiquement par exemple. Je pense que Personnage est dans la même situation. Dans tous les cas, utilisation des pointeurs nus est source de problème. Il faut toujours privilégier les pointeurs intelligents tel que std::unique_ptr.

    Pour le Makefile, en C++ on utilise les variables préfixés de CXX, et non C qui font référence au langage C.

    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CXX = g++
    CXXFLAGS = # ici mettre l'option @fichier
    CPPFLAGS = # CPP pour C-PreProcessor pour -I et -D
    SRC = $(wildcard *.cpp)
    O_FILES = $(SRC:.cpp=.o)
     
    fighter: $(O_FILES)
            $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $^ # je pense optionnel s'il y a un CC=$(CXX)
     
    # ...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Merci pour ta réponse
    Je programme en faisant un mélange de java et de C donc je ne sais pas si c'est très bien ^^
    Tu me dis que l'utilisation de Personnage alloué dynamiquement n'est pas top. Mais le problème c'est que je le crée dans une fonction, ce qui fait que je dois retourner une adresse alloué dans le tas pour que je puisse garder les données. Enfin pour attaque je ne sais pas combien d'attaque aura mon personnage, je le lis seulement dans le fichier

    Je n'arrive pas à utiliser les options pour le compilateur que tu m'as conseillé °-°

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    En ayant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Personnage* joueur;
    chargerJeu( joueur, &tour );
    Avec une fonction définie comme void chargerJeu( Personnage* joueur, int* tour );; donc passage d'une variable non initialisée (en plus c'est un pointeur!) le code ne va pas aller bien loin. Avec en plus des new dans le code, il doit y avoir d'autres erreurs. Et en effet le compilateur doit déjà émettre des warnings qui doivent tous être pris en compte.

    Partir d'un mélange de Java et de C, est surement la pire des bases pour travailler en C++. Il va te falloir t'appuyer sur un cours C++ robuste.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Dalfab mon compilateur ne m'a dit aucune erreur et aucun warnings °-°

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour préciser un peu la réponse de dalfab :

    Tu passes à ta fonction un pointeur par copie. Donc, dans la fonction tu assigne une nouvelle valeur à ce paramètre, mais ce paramètre n'a rien à voir avec la variable en dehors qui a servi à l'initialiser...

    https://cpp.developpez.com/faq/cpp/?...-a-ma-fonction
    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
    16
    17
     
    void f(Joueur *j)
    {
      j = new Joueur; // Ne modifie que le paramètre local
    }
     
    void g(Joueur *&j)
    {
      j = new Joueur; // Modifie la variable passée à la fonction
    }
     
    void h()
    {
      Joueur *j = nullptr;
      f(j); // j vaut toujours nullptr
      g(j); // j est modifié
    }
    Attention, le code comme g n'est pas un bon exemple à suivre, c'est juste pour expliquer ton problème.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par adjokaido Voir le message
    je dois retourner une adresse alloué dans le tas pour que je puisse garder les données.
    Si tu retournes vraiment une valeur, pourquoi la valeur de retour n'est pas utilisée/assignée ? C ou JAVA fonctionnent de la même manière là.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Effectivement, je suis passé par une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Personnage* chargerPersonnage() {
    //Lecture dans le fichier
    return new Personnage(paramètre lu dans le fichier);
    }
    Et mon problème est résolu °-°

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pourquoi new ? Pourquoi un pointeur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Personnage chargerPersonnage() {
    //Lecture dans le fichier
    return Personnage(paramètre lu dans le fichier);
    }
    Il peut y avoir de bonnes réponses à mes questions qui justifient un pointeur (intelligent, mais je ne pense pas que tu aies déjà vu ça), mais par défaut, on devrait manipuler les objets directement, et réserver les pointeurs aux cas où ils sont justifiés.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Pourquoi new ? Pourquoi un pointeur ?
    Utiliser des pointeurs permet par la suite d'utiliser le ,et aussi de déplacer moins de données en retour de la fonction. Donc si on déplace moins de données le programme est plus rapide

    Mais c'est vrai que j'ai pas vu les pointeurs intelligents, il faudrait que je me penche dessus avant d'aller plus loin.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par adjokaido Voir le message
    si on déplace moins de données le programme est plus rapide
    Autant c'est pas faux dans l'absolu, autant dans ce cas c'est loin d'être vrai.
    Un pointeur ça ajoute une indirection, et ici je ne vois absolument aucune raison à utiliser un pointeur, ni d'utiliser quelconque fonction, et non directement ton personnage sur la pile. Et la pile c'est mieux qu'un pointeur, la variable est directement accessible localement sans indirection. Et tu ne risques pas de créer une fuite mémoire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par adjokaido Voir le message
    Utiliser des pointeurs permet par la suite d'utiliser le ,
    C'est amusant, ce que tu décris comme une possibilité, je le décris comme une contrainte : Utiliser l'allocation dynamique impose à l'utilisateur de ta fonction d'utiliser un delete joueur; quelque-part, s'il ne veut pas avoir de fuites mémoire.

    Citation Envoyé par adjokaido Voir le message
    et aussi de déplacer moins de données en retour de la fonction. Donc si on déplace moins de données le programme est plus rapide
    Dans certains cas rares, ça peut effectivement avoir une importance. Mais c'est un compromis :
    + Peut-être plus rapide à déplacer
    - Passe par une allocation dynamique, qui est une opération coûteuse
    - Accès indirect aux données
    - Fragmentation accrue de la mémoire


    Au final :
    • L'optimisation n'est pas évidente
    • Si optimisation il y a, il s'agit d'une optimisation qui va à l'encontre de la simplicité du code. C'est à dire que c'est le genre d'optimisation à ne faire que si un benchmark montre :
      • Qu'il y a un problème de rapidité à résoudre
      • Que ce changement le résout bien


    Là, comme on parle quand même d'une fonction qui va lire des choses sur le disque, je ne crois pas qu'on soit à ça près...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Là, comme on parle quand même d'une fonction qui va lire des choses sur le disque
    Elle lit quand même pas mal d'information é_é
    Mais si je ne dois pas passer par un pointeur je ne peux plus utiliser le delete qui me libérais tout mes espaces alloué dans le tas.
    Donc pour cela il faut que je remplace des parties de mon code, comme par exemple dans mon Personnage.h Attaque** m_attaque
    Comment créer un tableau (liste) d'attaque qui ne soit pas alloué dynamiquement (dans le tas) ne sachant pas par avance combien d'attaque il aura.

  14. #14
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour avoir un tableau de taille variable, il y aura forcément à un moment une allocation dynamique (sauf si tu sais borner le nombre d'éléments, et que tu es près à perdre de la place), mais ce n'est pas à toi de gérer manuellement cette allocation dynamique, elle peut être entièrement prise en charge par un std::vector, par exemple ton personnage pourra avoir un std::vector<Attaque> m_attaque.

    Si les attaques sont une classe de base d'une hiérarchie polymorphe, il faudra alors passer par un pointeur supplémentaire, pour éviter le slicing. Par exemple un std::vector<std::unique_ptr<Attaque>> m_attaque
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    std::vector<std::unique_ptr<Attaque>> m_attaque
    Si je comprend bien ce code me permet de créer un pointeur vers tableau dynamique ?
    Mais si je veux ajouter un élément dans le tableau pas besoin d'un malloc/realloc du bon vieu C ?
    Je peux directement faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i=0;i<nb_attaque;i++)
         m_attaque[i]=new Attaque();
    J'ai vu en Java que l'on peut parcourir un tableau dynamique facilement dans ce style : for (Attaque a : m_attaque).
    J'aimerais savoir si il y a un équivalent en c++ ?

  16. #16
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par adjokaido Voir le message
    Si je comprend bien ce code me permet de créer un pointeur vers tableau dynamique ?
    Non , c'est un tableau de pointeurs intelligents sur des Attaque
    Citation Envoyé par adjokaido Voir le message
    Mais si je veux ajouter un élément dans le tableau pas besoin d'un malloc/realloc du bon vieu C ?
    Je peux directement faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i=0;i<nb_attaque;i++)
         m_attaque[i]=new Attaque();
    A la place tu utilises les capacités d'un vector donc ici à la place de ta boucle on ferait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    m_attaque.resize(nb_attaque);
    for ( auto&& a : m_attaque )
    		a = std::make_unique<Attaque>();
    Citation Envoyé par adjokaido Voir le message
    J'ai vu en Java que l'on peut parcourir un tableau dynamique facilement dans ce style : for (Attaque a : m_attaque).
    J'aimerais savoir si il y a un équivalent en c++ ?
    L'équivalent c'est for (auto&& a : m_attaque) a->attaquer(); et donc ici a sera du type std::unique_ptr<Attaque>&.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par dalfab Voir le message
    L'équivalent c'est for (auto&& a : m_attaque) a->attaquer(); et donc ici a sera du type std::unique_ptr<Attaque>&.
    Hmm je pense que si tu fais un auto&& tu déplaces chaque élément de m_attaque vers un temporaire, vidant au passage ton m_attaque du coup.
    Il vaudrait mieux faire un simple auto& ou const auto&.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  18. #18
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    En fait auto&& n'est pas une r-référence mais est une universal-référence. Elle permet de parcourir les collections dans les rares cas où l'itérateur retourne une r-référence (par exemple std::vector<bool>::iterator), et fournit une l-référence dans les autres cas. Il y a un article détaillé de scott meyer sur cela.

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par dalfab Voir le message
    En fait auto&& n'est pas une r-référence mais est une universal-référence.
    Il y a désormais un terme officiel pour ça, c'est forwarding reference. Et Scott Meyer est d'accord pour remplacer son appellation par celle-ci, plus précise.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Ha effectivement forward reference ça me parle, mais en dehors des templates un peu lourds j'aurais jamais fait le rapprochement.
    Je trouve ça un peu confusant dans le cas d'une simple boucle comme là par exemple, mais ça doit être utile dans d'autres cas je suppose (autre que les paramètres template).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2.x] Perte inexpliquée de méthode sur objet
    Par Phobizeur dans le forum Symfony
    Réponses: 1
    Dernier message: 02/10/2015, 19h08
  2. gestion des évènements sur objets dynamiques
    Par boss_gama dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/03/2009, 11h50
  3. Utiliser une CssClass sur objet dynamique
    Par starkson dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/07/2007, 09h54
  4. [IE vs FF] getElementsByName sur objet dynamique
    Par TSalm dans le forum Général JavaScript
    Réponses: 29
    Dernier message: 01/03/2007, 18h48
  5. Evenement sur objet dynamique
    Par CanardJM dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/11/2004, 13h56

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