Dalam konteks pengisihan menggunakan fungsi ahli sebagai pembanding, ralat kompilasi biasa timbul disebabkan larangan dalam ISO C terhadap mengambil alamat fungsi ahli bukan statik yang tidak layak atau dalam kurungan untuk membentuk penunjuk kepada ahli fungsi.
Pertimbangkan coretan kod berikut:
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); } };
Ralat berlaku apabila cuba memberikan alamat fungsi ahli doCompare sebagai argumen ketiga untuk std::sort. Untuk menyelesaikan isu ini, fungsi doCompare mesti diisytiharkan sebagai statik. Walau bagaimanapun, pendekatan ini mengehadkan keupayaan doCompare untuk mengakses ahli data MyClass.
Untuk mengatasi had ini, seseorang boleh mengubah MyClass menjadi functor perbandingan dengan mengubah suai doCompare seperti berikut:
bool operator () ( const int & i1, const int & i2 ) { // use some member variables }
Selepas itu, operasi pengisihan boleh digunakan sebagai:
doSort() { std::sort(arr, arr+someSize, *this); }
Perhatikan bahawa Kaedah doSort tidak mempunyai nilai pulangan, yang boleh diperbetulkan mengikut keperluan.
Sebagai alternatif, std::mem_fun boleh digunakan untuk menukar fungsi ahli kepada fungsi percuma, tetapi sintaksnya boleh menjadi rumit. Walau bagaimanapun, adalah disyorkan untuk membungkus fungsi dalam kelas, seperti yang digambarkan di bawah:
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)); } }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli dengan Betul sebagai Pembanding dalam Pengisihan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!