Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt : 5.11.1 - Qt Creator : 4.7.0 - Qt Installer : 3.0.4 - JOM : 1.1.2 - QBS : 1.12.0

Utilisation de pointeur sur fonctions

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 (ligne A)
Ensuite j’ai la fonction suivante que je pointe
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

//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(, 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

Réponses

  • Bonsoir,

    As-tu essayé d'appeler ta fonction comme ça ?
    majTableView(ClasseFuntCom::recupererTout, tableViewActuelle, name_table);
  • merci de ta réponse myrddin772 ,
    mais ça ne marche pas non plus
  • Pour appeler une méthode d'instance, il faut ... une instance :)

    Exemple:
    struct Pointer
    {
    void print(char* s) { printf("%s\n",s); }
    };

    typedef void (Pointer::*Print)(char* s);

    struct CallPt
    {
    void call(Print f,Pointer* pt) { (pt->*f)("hello"); } // appel print de l'instance pt
    };

    int main(int argc, char *argv[])
    {
    Pointer pt;
    Print print=&Pointer::print; // pointe la méthode print de Pointer

    (pt.*print)("hello"); // appel direct

    CallPt call;
    call.call(print,&pt); // appel via call

    return 0;
    }
    Question:
    Quelle est la raison d'utiliser un pointeur dans ton cas ?
    Tu as plusieurs méthodes recupererTout ?
  • bonjour,
    non je n'ai pas plusieures méthodes recupererTout , j'ai une seule méthode recupererTout et une méthode rechercherElmts
    voici leurs prototypes :
    recupererTout


    void ClasseBaseDeDonnees::recupererTout(FillTableView& fillTableView)

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


    la seule déférence est dans la requette
    _query = QSqlQuery("SELECT * FROM " + QString::fromStdString(fillTableView.table_name) + " WHERE titre like '%"+QString::fromStdString(fillTableView.titre_name)+"%'", _db);
    QMessageBox::information(0,"reqAjout","SELECT * FROM " + QString::fromStdString(fillTableView.table_name) + " WHERE titre like '%"+QString::fromStdString(fillTableView.titre_name)+"%'");
    il ya un WHERE pour la recherche et un SELECT tout avec recuperer tout
    et voici

    la structure FillTableView
    //////////////////////////////////////////////////////////////////////////////////////////////////
    /// \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;
    };
    la fonction appelante
    en fait, l'erreur venait du fait que les fonction pointées sont des fonctions membres, sur un autre forum quelqu'un m'a donné la solution c'est dans la déclaration

    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
    je suis en train de tester et je vous tiendrai au courant
  • en fait, l'erreur venait du fait que les fonction pointées sont des fonctions membres, sur un autre forum quelqu'un m'a donné la solution c'est dans la déclaration
    //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
    Oui, c'est exactement ce que j'ai dit dans mon post précédent.

    Je comprends toujours pas le but d'utiliser un pointeur de méthode.
    Qu'elle est la nature de ClasseBaseDeDonnees, un objet unique/global à l'application ?
  • C'est une classe qui contient les méthodes qui gèrent la base de données, elle st héritée par toutes les autres classes
  • 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.

    merci beaucoup pour la solution

    Merci à tous.
Connectez-vous ou Inscrivez-vous pour répondre.