5

ベクトルをソートするためにさまざまな戦略を使用したいと思います。std::sortしかし、子ファンクターを渡して後で使用する方法がわかりません。ソート戦略に抽象クラスを使用するときはいつでも、cannot allocate an object of abstract typeエラーが発生します。std::sort継承されたファンクターを引数として使用する方法はありますか?ありがとう!

#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;
}
4

1 に答える 1

9

を使用する必要があります。そうしないと、引数が値で渡されます(抽象であるため違法であるstd::ref()タイプのオブジェクトをコピー構築しようとするため、そうでない場合でも、スライスされます):BaseSortBaseSort

sort(values.begin(), values.end(), std::ref(*sortStrategy));
//                                 ^^^^^^^^
于 2013-03-25T00:27:07.457 に答える