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 :

Fonctionnement de struct operator()


Sujet :

C++

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut Fonctionnement de struct operator()
    Bonjour,

    En lisant l'article sur Boost.Array, je suis tombé sur une syntaxe que je ne comprends pas:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    struct Init
    {
        int i;
        Init() : i(0) { }
     
        int operator() (int)
        {
            return i++;
        }
    };
     
    struct TwoTimes
    {
        int operator() (int i)
        {
            return i*2;
        }
    };
     
    int main()
    {
    	boost::array<int,10> my_array;
     
    	transform(my_array.begin(),
                  my_array.end(),
                  my_array.begin(),
                  Init());
     
    	copy(my_array.begin(),my_array.end(),ostream_iterator<int>(cout," "));
     
        cout << endl;
     
    	transform(my_array.begin(),
                  my_array.end(),
                  my_array.begin(),
                  TwoTimes());
     
    	copy(my_array.begin(),my_array.end(),ostream_iterator<int>(cout," "));
    	return 0;
    }
    J'ai deux questions :
    • Comment fonctionne le premier struct ?
    • De l'appel eu 2ème transform, j'en déduis que TwoTimes est appelé pour chaque élément de my_array. Cela devrait être la même chose pour le premier appel à transform. Et pourtant, Init déclare i comme paramètre alors que TwoTimes ne le fait pas. Et pourtant les deux modifient la valeur de my_array qui leur est passée en "paramètre". Pourquoi ?


    Merci par avance pour votre aide

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Je ne pense pas pouvoir mieux t'expliquer que la FAQ C++ : http://cpp.developpez.com/faq/cpp/in...TL#STL_functor

    Après avoir lu et testé, tu comprendras sans doute ce qui te dérange pour le moment

  3. #3
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut
    Bonjour,

    Merci de m'avoir laissé réfléchir car j'ai fini par comprendre !!!
    • Dans le premier cas, on se fiche de la valeur de chaque élement du vecteur passé en argument. On a une variable interne et c'est elle qu'on renvoie en sortie de Init, sachant que cette variable est initialisée à zéro lors de l'appel au premier transform .
    • Dans le deuxième cas, on multiplie par deux chaque élément du vecteur passé en paramètre


    Encore emrci et bonne soirée

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    On a une variable interne et c'est elle qu'on renvoie en sortie de Init, sachant que cette variable est initialisée à zéro lors de l'appel au premier transform .
    i est initialisé lors de la création de l'objet Init, et non pas lors du premier appel au foncteur.

  5. #5
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut
    OK, et donc l'objet Init créé est local à l'exécution de la méthode transform(..) ce qui fait qu'on ne passe dans le constructeur lors de l'appel à transform(..) et lors de l'évaluation de chaque élément du vecteur, c'est le même "objet" Init qui est utilisé avec "i" incrémenté à chaque fois. C'est bien ça ?

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    C'est tout à fait ça. Créé au début, modifié à chaque appel à () (i est incrémenté)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Operation == qui ne fonctionne pas
    Par punisher999 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 20/07/2012, 21h21
  2. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  3. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  4. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10
  5. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25

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