Dans le contexte du tri utilisant les fonctions membres comme comparateurs, une erreur de compilation courante survient en raison d'une interdiction dans ISO C contre prendre l'adresse d'une fonction membre non statique non qualifiée ou entre parenthèses pour former un pointeur vers une fonction membre.
Considérez ce qui suit extrait de code :
class MyClass { int * arr; // other member variables MyClass() { arr = new int[someSize]; } doCompare( const int & i1, const int & i2 ) { // use some member variables } doSort() { std::sort(arr,arr+someSize, & doCompare); } };
L'erreur se produit lors de la tentative de fournir l'adresse de la fonction membre doCompare comme troisième argument à std::sort. Pour résoudre ce problème, la fonction doCompare doit être déclarée comme statique. Cependant, cette approche limite la capacité de doCompare à accéder aux données membres de MyClass.
Pour surmonter cette limitation, on peut transformer MyClass en foncteur de comparaison en modifiant doCompare comme suit :
bool operator () ( const int & i1, const int & i2 ) { // use some member variables }
Par la suite, l'opération de tri peut être invoquée comme :
doSort() { std::sort(arr, arr+someSize, *this); }
Notez que la méthode doSort n'a pas de valeur de retour, qui peut être corrigé si nécessaire.
Alternativement, std::mem_fun peut être utilisé pour convertir la fonction membre en une fonction libre, mais la syntaxe peut être complexe. Néanmoins, il est recommandé d'envelopper la fonction dans la classe, comme illustré ci-dessous :
class MyClass { struct Less { Less(const MyClass& c) : myClass(c) {} bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} MyClass& myClass; }; doSort() { std::sort(arr, arr+someSize, Less(*this)); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!