Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation de pointeur sur fonctions

Utilisation de pointeur sur fonctions

    18 avril 2018 à 21:08:36

    Bonjour à tous;

    J’ai essayé d’utiliser les pointeurs sur fonction, mais je suis bloqué est pourtant l’erreur n’est pas apparente.

    Remarque : j’ai supprimé le code inutile pour augmenter la lisibilité.

    Donc voici mon code.

    J’ai une fonction

    void ClasseFunctCom::majTableView(void (*pf)(QStandardItemModel* model, std::string table_name), QTableView *tableView, string name_table)
    
    {
    
        //Si la base de données a était ouverte on continue, et on affecte la table des produits brutes au model
    
        connexion();
    
        //On déclare le model
    
        //QSqlTableModel *modelTable = new QSqlTableModel(0, _db);
    
        QStandardItemModel* model = new QStandardItemModel();
    
        //On recupere les éléments et on remplit le model avec le pointeur sur fonction;
    
        (*pf)(model, name_table); //LIGNE A
    
         //On affecte le model à la table view
    
        tableView->setModel(model);
    
    //Autres code
    
    }



    Dans la quelle j’utilise le pointeur sur fonction

    Ensuite j’ai la fonction suivante que je pointe 

    //LIGNE B
    
    void ClasseBaseDeDonnees::recupererTout(QStandardItemModel* model, std::string table_name)
    
    {
    
        //code a réalisé
    
    }


    Ensuite j’ai une fonction dans la quelle j’appelle une fonction par son pointeur //LIGNE B

    void MainWindow::supprimerElements()
    
    {
    
    //Autres code
    
     
    
       //On fait une mise a jour de la tableview
    
       majTableView(recupererTout, tableViewActuelle, name_table); //LIGNE B
    
     
    
       //majTableView(tableViewActuelle, name_table);
    
       //On aafiche un message de satisfaction a l'utilisateur.
    
       QMessageBox::information(this, QObject::tr("Succès"), QString::number(nbrElmtsSupprimer)+" "+QObject::tr("élément(s) supprimé(s)"));
    }



    Mais quand je lance le programme, jai l’erreur suivante

    D:\Fichiers applications\C++\Projets_QtCreator\Projet_memo_movies\Memo_movies\MainWindow.cpp:56: erreur : no matching function for call to 'MainWindow::majTableView(<unresolved overloaded function type>, QTableView*&, std::__cxx11::string&)'

        majTableView(recupererTout, tableViewActuelle, name_table);

    qui est juste devant la ligne

    majTableView(recupererTout, tableViewActuelle, name_table);



    et je ne vois vraiment pas où est le bug

    sachant que

    MainWindow hérite de ClasseFunctCom

    Et ClasseFunctCom hérite de ClasseBaseDeDonnees

    Merci d’avance pour votre aide 
    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2018 à 22:21:35

      Hello.

      Vu que c'est une fonction membre le & est de tête indispensable car tu as le paramètre this en plus.


      Essaie "&ClasseBaseDeDonnees::recupererTout"ccomme paramètre plutôt.

      (toujours de tête désolé je n'ai rien pour tester sous le coude)

      • Partager sur Facebook
      • Partager sur Twitter
        19 avril 2018 à 0:23:25

        Merci ThomPiv pour ta réponse rapide, mais j'ai toujours le même problème avec cette solution

        • Partager sur Facebook
        • Partager sur Twitter
          19 avril 2018 à 1:19:45

          Merci ads00, mais en fait, j'ai deux fonctions, qui me servent à remplir un QTableView, elles reçoivent 2 paramètres (QStandardItemModel*model,std::string table_name) l'une des deux fonction remplira le modele avec toute la table, alors que la deuxième ne le remplira qu'avec les élément qui correspondent à une recherche. c'est pour ça que j'ai opté pour les pointeurs sur fonction.
          • Partager sur Facebook
          • Partager sur Twitter
            19 avril 2018 à 18:28:45

            non en fait, std::fonction n'est pas adapter à mon cas, vue que mes deux fonctions ne change pas de type de paramètres

            void ClasseBaseDeDonnees::recupererTout(FillTableView& fillTableView)
            
            et voici 
            void ClasseBaseDeDonnees::rechercherElmts(FillTableView& fillTableView)



            et voici la structure

            //////////////////////////////////////////////////////////////////////////////////////////////////
            /// \struct FillTableView
            /// \brief Structure qui contient les données pour remplir le modele de la tableView.
            struct FillTableView
            {
                QStandardItemModel* item_model;
                QTableView* table_view;
                std::string table_name;
                std::string titre_name;
            };
            quelqu'un m'a donné la solution sur un autre forum
            l'erreur venait du fait que les fonctions étaient des fonctions membres, alors iil faut les déclarées de cette façon
            void ClasseFunctCom::majTableView(void (ClasseBaseDeDonnees::*pf)(QStandardItemModel* model, std::stringtable_name), QTableView*tableView, stringname_table){
            //.....
            //On recupere les éléments et on remplit le model avec le pointeur membre sur fonction membre;
            (this->*pf)(model, name_table); // on a accède
            //....
            }
            je suis en train de tester la solution et je vous tiendrai au courant
            en tout cas merci beaucoups
             

            • Partager sur Facebook
            • Partager sur Twitter
              19 avril 2018 à 19:20:37

              T'as lu la doc ? Tu peux faire cque tu veux avec. Tu as même un exemple avec ton cas.

              • Partager sur Facebook
              • Partager sur Twitter
                24 avril 2018 à 16:37:17

                Bonjour à tous,

                Désolé pour le retard, mais j'avais un problème de formatage.

                En tout cas j'ai changé de stratégie, parce que finalement le jeu ne vaut pas la chandelle, je n'avais pas vraiment la nécessité d'utiliser les pointeurs sur fonction.

                en tout cas si ça peut aider quelqu'un : 

                si il s'agit d'une fonction membre il faut procéder de cette façon :

                void ClasseFunctCom::majTableView(void (ClasseBaseDeDonnees::*pf)(QStandardItemModel* model, std::string table_name), QTableView *tableView, string name_table)
                //.....
                //On recupere les éléments et on remplit le model avec le pointeur membre sur fonction membre;
                (this->*pf)(model, name_table); // on a accède

                c'est mpergand  sur le forum http://qtfr.dergen.fr/discussion/comment/124909#Comment_124909 qui m'a donner la solution

                Merci à tous.

                • Partager sur Facebook
                • Partager sur Twitter
                  24 avril 2018 à 17:11:29

                  Lu',

                  Vu que tu as changé d'avis, voici un exemple d'utilisation de std::function qui était très bien adapté à ton cas.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Eug

                    24 avril 2018 à 23:14:31

                    Pour ceux qui auront le même problème que toi, la solution c'est std::function

                    Faut juste lire la doc, et si tu comprends pas tu demandes.

                    -
                    Edité par ads00 24 avril 2018 à 23:20:03

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Utilisation de pointeur sur fonctions

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown