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

Langage C++ Discussion :

passer un argument avec


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 160
    Par défaut passer un argument avec
    Bonjour,
    j ai un probleme avec les fonctions objets. pouvez vous m aider a le resoudre.
    j ai une classe task qui a une methode getRealLPTproc(m) qui prend un entier.
    j ai fais une fonction objet que je compte utiliser pour trier le tableau.

    mon probleme est comment passer le parametre a la fonction objet (la syntaxe). a ce stade, la valiable m n'est pas reconnue. dans la fonction lptproc2.


    Merci d avance pour votre aide


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct lptproc2 : public binary_function<task, task, bool> {
    	bool operator()(task x, task y) {
    		return x.getRealLPTproc(m) >= y.getRealLPTproc(m) ; }
        };

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    C'est justement là que se trouve l'intérêt d'une fonction objet par rapport à une fonction classique. Une fonction-objet peut avoir un état, car c'est certes une fonction, grâce à son opérateur(), mais aussi un objet qui peut avoir des membres comme n'importe quel objet. Une fonction-objet peut donc, en fait, "capturer" le contexte qui la précède. Pour ça, on utilise son constructeur :

    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
     
    struct lptproc2 : public binary_function < const task&, const task&, bool >
    {
       // on passe généralement task par référence constante 
       // pour éviter la copie
       bool operator()(const task& x, const task& y) const
       {
          return x.getRealLPTproc(m) >= y.getRealLPTproc(m) ; 
       }
     
       // on récupère le paramètre m dans le constructeur et on l'affecte
       // à notre membre m_;
       lptproc2(int m):m_(m)
       {
       }
     
       // variable membre
       int m_;
    }; 
     
    // utilisation : 
    std::vector<task> vec;
    // on remplit le tableau...
     
    int m = 5;
    lptproc2 lp(m); // on construit notre fonction-objet en passant m 
    // au constructeur; m est "capturé" dans lp.
     
    // Puis on passe la fonction-objet par valeur à sort
    std::sort(vec.begin(), vec.end(), lp);
     
    // variante : on construit la fonction-objet et on la passe à
    // sort dans le même ligne :
    std::sort(vec.begin(), vec.end(), lptproc2 (m));

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 160
    Par défaut
    Merci pour votre votre reponse tres enrichissante
    j ai copié ce que tu as proposé
    dans la fonction main() j ai ecris ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lptproc2 lp(m);
    sort(tl.begin(),tl.end(),lp(m));   //// LIGNE 834
    au moment de la compilation, je recoir ce message
    g++ -g parco.cpp -o schedule
    parco.cpp: In function ‘int main(int, char**)’:
    parco.cpp:834: erreur: no match for call to ‘(lptproc2) (int&)’
    parco.cpp:257: note: candidats sont: bool lptproc2::operator()(task&, task&) const

    quelle est le probleme en ce moment.

    Merci

  4. #4
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    lptproc2 lp(m); // construction de la variable lp.
    lp(m); // erreur: appel de l'opérateur () sur lp avec comme paramètre m. or, il n'existe pas.
    lp(); // ok
     
    lptproc2(m)(); // construction d'une variablee lptproc2 temporaire avec le paramètre m et appel de son opérateur ().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::sort(vec.begin(), vec.end(), lp(m)); // erreur: std sort appelle l'opérateur () de l'objet passé en paramètre 3. Or, lp(m) n'est pas un objet, c'est l'appel d'une fonction.
    De ce fait, soit tu utilises la 1ère méthode qu'il a suggéré, tu distingue bien la création de ton objet et l'endroit où tu appelles un tri avec.

    Soit, tu fais tout en même temps:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::sort(vec.begin(), vec.end(), lptproc2(m));

  5. #5
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Mince désolé, j'ai fait une erreur.

    Pour le tout-en-un (construction d'une fonction-objet de type lptproc2 en appelant son constructeur "lptproc2(int)" et passage à sort() sur la même ligne), il faut effectivement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::sort(vec.begin(), vec.end(), lptproc2(m));
    Je corrige mon premier post.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 160
    Par défaut
    Bonjour

    un autre probleme est apparue.
    j ai adopté cette version
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sort(tl.begin(),tl.end(),lptproc2(m));
    et le message est le suivant
    g++ -g parco.cpp -o schedule
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h: In function ‘const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = task, _Compare = lptproc2]’:
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h:1952: instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<task*, std::vector<task, std::allocator<task> > >, _Size = int, _Compare = lptproc2]’
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h:4820: instantiated from ‘void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<task*, std::vector<task, std::allocator<task> > >, _Compare = lptproc2]’
    parco.cpp:833: instantiated from here
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h:128: erreur: no match for call to ‘(lptproc2) (const task&, const task&)’
    parco.cpp:257: note: candidats sont: bool lptproc2::operator()(task&, task&) const
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h:129: erreur: no match for call to ‘(lptproc2) (const task&, const task&)’
    parco.cpp:257: note: candidats sont: bool lptproc2::operator()(task&, task&) const
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h:131: erreur: no match for call to ‘(lptproc2) (const task&, const task&)’
    parco.cpp:257: note: candidats sont: bool lptproc2::operator()(task&, task&) const
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h:135: erreur: no match for call to ‘(lptproc2) (const task&, const task&)’
    parco.cpp:257: note: candidats sont: bool lptproc2::operator()(task&, task&) const
    /usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../include/c++/4.3.2/bits/stl_algo.h:137: erreur: no match for call to ‘(lptproc2) (const task&, const task&)’
    parco.cpp:257: note: candidats sont: bool lptproc2::operator()(task&, task&) const
    make: *** [schedule] Erreur 1


    Par ailleurs ARZAR, je pense que dans cette ligne (premier poste)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     return x.getRealLPTproc(m) >= y.getRealLPTproc(m) ;
    il faut remplacer m par m_

    Merci
    Adel

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 160
    Par défaut
    Voici le code de ma fonction objet
    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
    struct lptproc2 : public binary_function <  task&,  task&, bool >
    {
       // on passe généralement task par référence constante
       // pour éviter la copie
       bool operator()( task& x,  task& y)
       {
          return x.getRealLPTproc(m_) >= y.getRealLPTproc(m_) ;
       }
     
       // on récupère le paramètre m dans le constructeur et on l'affecte
       // à notre membre m_;
       lptproc2(int m):m_(m)
       {
       }
     
       // variable membre
       int m_;
    };
    Merci pour votre aide

Discussions similaires

  1. Passer des arguments avec la commande "Shell"
    Par bbor99 dans le forum VB.NET
    Réponses: 1
    Dernier message: 25/11/2011, 23h18
  2. Passer des argument avec le manifeste java
    Par hotward dans le forum Général Java
    Réponses: 3
    Dernier message: 09/09/2009, 06h23
  3. passer des arguments avec Runtime.getRuntime().exec;
    Par firgon dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 07/11/2008, 07h16
  4. [Batch] passer un argument avec la commande Start
    Par metatron dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 17/08/2008, 21h59
  5. [Configuration] Impossible de passer des arguments avec require
    Par black is beautiful dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 06/10/2007, 21h58

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