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 :

méthode statique avec sort


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut méthode statique avec sort
    Bonjour à tous,

    Je ne sais pas si c'est le bon endroit pour poser cette question mais soit.
    En fait, je suis en train de réaliser un programme c++ dans lequel j'ai une classe A ayant pour attribut un vecteur d'objets C. Jusque là rien de bien fou ^^.
    Par contre, je veux faire un tri de mon vecteur et pour ce faire j'ai utilisé la fonction sort() de la librairie standard.
    Je m'y prends ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    bool A::myFunction(const C *a,const C *b)
    {
         return a->attribut < b->attribut;
    }
    
    void A::vectorSort()
    {
    sort(myVector.begin(),myVector.end(), myFunction);
    }
    cela ne fonctionne que si ma méthode myFunction est une fonction globale à mon programme ou si elle est définie statique dans ma classe A.
    J'aimerais juste comprendre pourquoi si je la définis bêtement comme une fonction membre non statique de ma classe A cela foire complet ?

    Merci d'avance

  2. #2
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Une fonction membre non statique peut être vue comme prenant un paramètre supplémentaire, l'objet auquel elle s'applique :
    a.f(b) est semblable à f(a, b)

    Là tu as besoin d'une fonction pour comparer des C*, elle n'a pas ce pseudo paramètre supplémentaire, et de toute façon, même si elle l'avait, quelle valeur donner à ce paramètre ?

    D'où l'intérêt d'une fonction non membre, ou d'une fonction statique.
    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.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, le prototype d'une fonction membre est (par exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int MaClasse::maFonction(int);
    qui est différent de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int maFonction(int);

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    JolyLoic:

    Merci pour la réponse déjà. Sinon, euh, je ne suis pas sur de comprendre mais en tous cas ça m'a fait penser à un truc et effectivement je crois avoir trouvé la réponse en tous cas. Dis moi si c'est ça que tu voulais me dire lol

    Salseropom:

    Merci pour ta réponse tout d'abord. Mais, euh je connais la différence entre une méthode, une fonction globale et une méthode statique. Je comprends juste pas dans ce contexte bien précis pourquoi une méthode statique est nécessaire

    ---------------------------------------

    Mais après un éclairage divin ^^, en fait, oui c'est normal. Une méthode statique d'une classe permet d'être utilisée sans même qu'une instance de la classe ait été créée. Et justement dans mon sort, j'utilise myFonction sans dire à quel objet je me réfère. Donc, effectivement d'où l'obligation de la déclarer statique si je ne dis pas de grosses conneries et je crois que je rejoins un peu ce que tu voulais dire JolyLoic.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par slig_80 Voir le message
    Mais après un éclairage divin ^^, en fait, oui c'est normal. Une méthode statique d'une classe permet d'être utilisée sans même qu'une instance de la classe ait été créée. Et justement dans mon sort, j'utilise myFonction sans dire à quel objet je me réfère. Donc, effectivement d'où l'obligation de la déclarer statique si je ne dis pas de grosses conneries et je crois que je rejoins un peu ce que tu voulais dire JolyLoic.

    C'est ça et c'est similaire à ce que Loic t'a dit juste avant.
    Une fonction membre d'une classe a besoin d'un objet sur lequel s'appliquer.
    Une fonction statique ou une fonction libre (non rattachée à une classe) n'ont pas besoin d'objet sur lequel s'appliquer.
    L'algorithme de tri template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); suppose à un moment un appel de type comp(it1, it2) pour lequel il n'y a pas d'objet.
    Note que pour template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last); la comparaison serait it1<it2. Cette écriture peut elle correspondre soit à une fonction libre soit une fonction membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct my_struct
    {
    };
    bool operator<(my_struct const&,my_struct const&);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct my_struct
    {
        bool operator<(my_struct const&)const;
    };
    Mais bien sur cela ne fonctionne pas avec un itérateur qui renvoie un pointeur car ce sont alors les adresses qui sont comparées.


    Le pied ? Avec C++0X, les lambdas permettent de définir in situ la fonction de tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        std::sort(myVector.begin(),myVector.end(),
            [](C*const t1, C*const t2)
            {
                return t1->attribut<t2->attribut;
            }
        );

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Merci 3DArchi pour toutes ces explications supplémentaires et merci aux autres également

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

Discussions similaires

  1. [PHP 5.3] [POO]Problème avec une méthode statique
    Par yann18 dans le forum Langage
    Réponses: 6
    Dernier message: 25/05/2011, 19h32
  2. Pattern singleton ou Classe avec méthodes statiques ?
    Par Claythest dans le forum Langage
    Réponses: 3
    Dernier message: 11/12/2006, 11h28
  3. Méthode Download avec le composant TNMFTP
    Par mattdef dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/10/2005, 06h48
  4. Impression d'éléments Statiques avec QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/12/2003, 18h49
  5. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10

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