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 :

Demande explication sur structure


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 129
    Points : 41
    Points
    41
    Par défaut Demande explication sur structure
    Bonjour
    Malgré des recherches je n'arrive pas à comprendre cette structure

    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
    18
    19
    20
    template <typename T>                                  //ligne 1
    struct processus                                                 //ligne 2
    {
    typedef std::pair<double, T> state;                           //ligne 3                  
    typedef std::list<state> result_type;                          //ligne 4
    typedef typename result_type::iterator iter;                //ligne 5 
    typedef typename result_type::const_iterator cst_iter;   //ligne 6 
    processus(int size = 0) : value(size) {};                     //ligne 7 
    virtual result_type operator()() = 0;                          //ligne 8 
    result_type current() const { return value; };             //ligne 9 
    template <typename S>                                          //ligne 10 
    friend std::ostream& operator<<(std::ostream &o,           //ligne 11 
    const processus<S> &p)                                          //ligne 12 
    {
      o << 0;
      return o;
    }
    protected:
    result_type value;
    };
    Ainsi voici ce que j'ai compris mais qui peut être faux et mes questions
    ligne 3 : state a pour type un couple (double et suivant besoin int,char,float etc ...)
    ligne 4 : result_type est une liste chainée du couple précédent mais pourquoi le compilateur n'accepte-t-il pas
    typedef std::list<std::pair<double, T>> result_type;

    Les autres lignes sont un peu le flou pour moi. Si d'aucun peut me donner des explications assez précises je l'en remercie par avance et cela me fera gagner du temps et m'évitera d'interpeler le forum.

    Dernière précision : je suis complètement autodidacte en C++.

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par tom31 Voir le message
    ligne 3 : state a pour type un couple (double et suivant besoin int,char,float etc ...)
    Ce n'est pas tout à fait exact. En fait, state est un type composé d'un double et d'un type variable (template).

    Citation Envoyé par tom31 Voir le message
    pourquoi le compilateur n'accepte-t-il pas
    typedef std::list<std::pair<double, T>> result_type;
    Il me semble que la syntaxe exacte devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::list< std::pair< double, T > > result_type;
    c'est à dire en mettant des espaces. Sinon, le compilateur peut croire que >> est un opérateur d'indirection de flux. Après, je crois que cette histoire d'espace n'est pas la même selon les compilateurs.

    Quant au reste, ça va être long à expliquer
    Si j'ai 5mn de libre je m'y colle.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 129
    Points : 41
    Points
    41
    Par défaut
    Je vous remercie et effectivement si vous trouvez 5 minutes elles auront en ce qui me concerne un effet levier en me faisant gagner beaucoup de temps.
    Je vous remercie, de nouveau, par avance.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Alors,

    Cette ligne déclare une variable membre de type result_value, dont le nom est value.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef typename result_type::iterator iter;                //ligne 5 
    typedef typename result_type::const_iterator cst_iter;   //ligne 6
    Ces deux lignes déclarent des iterateurs. Ce sont des objets qui permettent de parcourir les objets stockés dans cet objet. Ici, ce sera sans doute pour parcourir value. Celui de la ligne 6 est un iterateur constant, c'est à dire que si on l'utilise, on ne pourra pas modifier l'objet sur lequel il pointe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    processus(int size = 0) : value(size) {};                     //ligne 7
    Ça c'est un constructeur. Il définit à la fois un constructeur par défaut (si aucun paramètre ne lui est fourni, size sera 0) et un constructeur qui prend un paramètre: size.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual result_type operator()() = 0;
    Ça c'est l'opérateur d'appel de fonction. En général, il sert pour permettre l'utilisation de cet objet en tant que foncteur. Parfois, c'est juste pour simplifier son utilisation.
    Ici, cet opérateur est virtuel pur, ce qui signifie (entre autres) que:
    1. cette classe ne peut pas être instanciée. En java, on dirait que c'est une interface.
    2. les classes qui héritent de celle-ci devront obligatoirement implémenter cette fonction. C'est la raison pour laquelle on parle souvent de "programmation par contrat" lorsqu'on utilise des fonctions virutelles pures: on signe un contrat avec les classes qui vont hériter, contrat qui consiste en l'implémentation de ces fonctiones virtuelles pures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result_type current() const { return value; };             //ligne 9
    Ça c'est un simple accesseur. Il est déclaré constant car, et c'est logique, il n'est pas sensé modifier l'instance qui l'appelle. Attention cependant, cet accesseur renvoie une copie de l'objet value.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <typename S>                                          //ligne 10 
    friend std::ostream& operator<<(std::ostream &o,           //ligne 11 
    const processus<S> &p)                                          //ligne 12 
    {
      o << 0;
      return o;
    }
    Ça c'est l'opérateur d'indirection de flux. C'est le même opérateur qui est utilisé dans le code suivant par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << "hello word" << std::endl;
    Par contre, l'implémentation de cet opérateur est étrange (le corps de la fonction), je ne la comprend pas.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 129
    Points : 41
    Points
    41
    Par défaut
    Un sincère et reconnaissant

    ............ Merci ..............

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par r0d Voir le message
    Il me semble que la syntaxe exacte devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::list< std::pair< double, T > > result_type;
    c'est à dire en mettant des espaces. Sinon, le compilateur peut croire que >> est un opérateur d'indirection de flux. Après, je crois que cette histoire d'espace n'est pas la même selon les compilateurs.
    C'est tout à fait exact, GCC signale l'erreur et demande d'ajouter un espace. Visual Studio passe outre et compile.
    Find me on github

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    C'est tout à fait exact, GCC signale l'erreur et demande d'ajouter un espace. Visual Studio passe outre et compile.
    Pour ce que j'en sais, VS2010, oui, parce qu'il intègre spécifiquement cette fonctionnalité du C++0x ; mais je ne pense pas que ce soit le cas pour les versions précédentes (il faudra que je teste ; je sais qu'au pire, on a un warning ; au mieux, une erreur de compilation).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Pour ce que j'en sais, VS2010, oui, parce qu'il intègre spécifiquement cette fonctionnalité du C++0x ; mais je ne pense pas que ce soit le cas pour les versions précédentes (il faudra que je teste ; je sais qu'au pire, on a un warning ; au mieux, une erreur de compilation).
    J'ai testé sur un Visual Studio 2008, ça passe sans warning ni rien. D'ailleurs, les fonctionnalités C++0x ne sont disponibles que si demandées via une option spécifique il me semble.
    Find me on github

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/09/2009, 13h08
  2. demande explication sur scope
    Par ranell dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 12/01/2008, 21h32
  3. Réponses: 7
    Dernier message: 21/10/2007, 01h50
  4. Demande explication sur 1 CSS
    Par tigunn dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 02/03/2007, 17h27
  5. Demande explication sur un composant ADO
    Par Golork dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/07/2005, 20h22

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