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 confirm�
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 295
    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.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 295
    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.

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    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
    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.

  7. #7
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    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
    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
    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.

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