Pertanyaan std :: sort menggunakan functed inhered


Saya ingin menggunakan strategi yang berbeda untuk mengurutkan vektor. Tapi aku tidak tahu cara melewatkan fungsi anak dan menggunakannya std::sort kemudian. Setiap kali saya menggunakan kelas abstrak untuk menyortir strategi saya berakhir dengan cannot allocate an object of abstract type kesalahan. Apakah ada cara untuk menggunakan fungsi yang diwariskan sebagai std::sort argumen? Terima kasih!

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


class BaseSort{
public:
    virtual ~BaseSort() {};
    virtual bool operator()(const int& a, const int& b) = 0;
};

class Asc : public BaseSort{
public:
    bool operator()(const int& a, const int& b){
        return a < b;
    }
};

class Desc : public BaseSort{
public:
    bool operator()(const int& a, const int& b){
        return a > b;
    }
};

void print(const vector<int>& values) {
    for (unsigned i = 0; i < values.size(); ++i) {
        cout << values[i] << ' ';
    }
    cout << endl;
}

int main() {
    vector<int> values = {2,1,3};
    sort(values.begin(), values.end(), Asc()); // {1,2,3}
    print(values);
    sort(values.begin(), values.end(), Desc()); // {3,2,1}
    print(values);
    Asc* asc = new Asc();
    sort(values.begin(), values.end(), *asc); // {1,2,3}
    print(values);
    BaseSort* sortStrategy = new Desc();
    sort(values.begin(), values.end(), *sortStrategy); //cannot allocate an object of abstract type ‘BaseSort’
    print(values);
    return 0;
}

5
2018-03-25 00:22


asal


Jawaban:


Anda harus menggunakan std::ref(), jika tidak, argumen akan dilewatkan oleh nilai (menyebabkan upaya untuk menyalin-membangun suatu objek tipe BaseSort, yang ilegal sejak itu BaseSort abstrak - dan bahkan jika tidak, Anda akan mendapatkannya mengiris):

sort(values.begin(), values.end(), std::ref(*sortStrategy));
//                                 ^^^^^^^^

9
2018-03-25 00:27