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 :

pointeur sur fonction membre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 278
    Par défaut pointeur sur fonction membre
    Bonjour à tous,

    en C++, il est possible de transmettre une fonction par référence à une méthode (au sens de l'objet) ou a une autre fonction.

    Mais est-il possible de transmettre une méthode (au sens de l'objet) par référence?

    merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    kamoulox
    tu veux faire quoi ou tu crois que quoi n'est pas possible ?
    méthode = fonction donc tes 2 phrases sont identiques, et "au sens de l'objet" c'est sensé vouloir dire quoi ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 278
    Par défaut
    Citation Envoyé par Bousk Voir le message
    kamoulox
    Bonjour,

    Citation Envoyé par Bousk Voir le message
    tu veux faire quoi ou tu crois que quoi n'est pas possible ?
    Je voudrais savoir si donner une méthode en argument d'une fonction est possible, comme il est possible de le faire pour une fonction.

    Citation Envoyé par Bousk Voir le message
    méthode = fonction donc tes 2 phrases sont identiques, et "au sens de l'objet" c'est sensé vouloir dire quoi ?
    "Au sens de l'objet" avait pour but de préciser qu'il s'agit bien d'une méthode implémentée au sein d'une classe. Cette précaution oratoire était peut-être inutile, mais mon objectif était de me faire comprendre au mieux.

    Méthode != fonction. Une méthode est propre à une classe, ce que n'est pas une fonction. De plus, concernant le problème qui nous intéresse, j'ai vu plusieurs sources indiquant que pthread_create, par exemple, n'acceptait en argument que des méthodes statiques.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Ce que t'appelles méthode c'est une fonction membre, et choisir l'un ou l'autre des noms est une nomenclature que chacun suit ou non et absolument pas un standard.
    La seule différence c'est leur signature.
    Et passer une fonction en paramètre c'est créer un foncteur.
    pthread_create c'est une lib en C où les fonctions membre n'existent pas. Ça prend ce que le C permet, des fonctions libres (ou static).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 278
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Ce que t'appelles méthode c'est une fonction membre, et choisir l'un ou l'autre des noms est une nomenclature que chacun suit ou non et absolument pas un standard.
    La seule différence c'est leur signature.
    J'appelle méthode une méthode au sens de l'objet, et c'était très clair dans mon message.
    Et il n'y a pas qu'une différence de signature entre une fonction et une méthode au sens de l'objet.

    Citation Envoyé par Bousk Voir le message
    Et passer une fonction en paramètre c'est créer un foncteur.
    pthread_create c'est une lib en C où les fonctions membre n'existent pas. Ça prend ce que le C permet, des fonctions libres (ou static).
    Il y a beaucoup plus simple pour passer une fonction en paramètre: lui transmettre un pointeur sur cette fonction, c'est ce qui est fait dans le code que j'ai récupéré, et je réfléchis à la réécrire en objet.

    Citation Envoyé par Bousk Voir le message
    pthread_create c'est une lib en C où les fonctions membre n'existent pas. Ça prend ce que le C permet, des fonctions libres (ou static).
    S'il n'y avait pas de différence entre méthode et fonction en C++, pthread_create accepterait des méthodes en argument.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Chezkele Voir le message
    J'appelle méthode une méthode au sens de l'objet
    En C++, on retrouve plutôt le terme de "fonction membre" (ou "member function", en anglais) que le terme de "méthode". Voir https://en.cppreference.com/w/cpp/la...mber_functions

    Je suppose que ton problème est : comment passer un couple [objet ; fonction membre] là où tu passes habituellement un simple pointeur sur fonction, non ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Chezkele Voir le message
    J'appelle méthode une méthode au sens de l'objet, et c'était très clair dans mon message.
    Et il n'y a pas qu'une différence de signature entre une fonction et une méthode au sens de l'objet.



    Il y a beaucoup plus simple pour passer une fonction en paramètre: lui transmettre un pointeur sur cette fonction, c'est ce qui est fait dans le code que j'ai récupéré, et je réfléchis à la réécrire en objet.



    S'il n'y avait pas de différence entre méthode et fonction en C++, pthread_create accepterait des méthodes en argument.
    Si tu sais déjà tout pourquoi venir poser des questions alors ?
    C'est un nouveau concept de venir avec des questions, dire qu'en fait non on a raison et on sait mieux les réponses et surtout ne jamais présenter de code incriminé ?

    On utilisait pthread y'a 20 ans déjà, tout comme le C++, et les deux ensembles. Des ressources qui montrent comment faire sont légion sur internet pour qui veut bien chercher.
    Sur ce seul forum il y a des dizaines de résultats à ce sujet. Avec le simple "pthread_create", donc pas vraiment un terme caché ou obscur, pour faire ressortir des résultats probants.
    https://www.developpez.net/forums/d1.../#post10432689
    https://www.developpez.net/forums/d1...thread_create/
    https://www.developpez.net/forums/d1...e/#post8106791
    https://cpp.developpez.com/faq/cpp/?...ur-de-fonction
    https://www.developpez.net/forums/d1...s/#post7553057
    https://www.developpez.net/forums/d1...e/#post7552025
    https://www.developpez.net/forums/d1...ction-d-objet/

    Et maintenant on préfèrera le plus souvent std::thread qui est dans le standard depuis C++11.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Il existe std::thread pour ne pas avoir à ce préoccuper de toute la gestion des pointeurs de fonction. Sinon, un simple intermédiaire comme ce qui suit suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    auto func = [](void* ctx) {
      static_cast<LeTypeVoulut*>(ctx).la_fonction();
      return ....
    };
    pthread_create(thread, attr, func, &obj);

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    static_cast n'a rien à voir avec la notion de statique.
    Lorsque tu fais 1 cast "à la C", tu fais soit 1 static_cast soit 1 reinterpret_cast, ce qui peut provoquer des pièges (il faut lire la norme pour le comment de la chose)
    En C++, tout est clair et il y en a 2 autres spécifiques au C++ const_cast et dynamic_cast.
    Pourquoi on parle de cast d'un seul coup ?

    const_cast est possible en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
        const int a = 2;
        int * p = (int*) &a;
        *p = 45;
        return a;
    }
    Seul dynamic_cast est spécifique au C++.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/01/2011, 16h37
  2. Réponses: 2
    Dernier message: 30/03/2009, 12h21
  3. Réponses: 11
    Dernier message: 21/05/2006, 14h39
  4. transmettre une valeur par l'url
    Par Destampy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 07/06/2005, 15h57

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