2013-03-25 27 views
5

Vektör sıralamak için farklı stratejiler kullanmak istiyorum. Ama bir çocuk bisikletçinin nasıl geçeceğini ve daha sonra std::sort'da nasıl kullanacağımı anlayamıyorum. Ne zaman sınıflandırma stratejisi için soyut sınıf kullanıyorum cannot allocate an object of abstract type hatası ile sonuçlanır. Kalıtsal fokları std::sort argümanları olarak kullanmanın bir yolu var mı? Teşekkürler! Ve hatta o olmasaydı -std :: devralınan functor kullanarak sıralama

#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; 
} 
+1

ancak karşılaştırıcının fonksiyon operatör const' 'olmalıdır: Eğer ) dilimleme tanınacak. Yani virtual bool operatörü() (const int & a, const int & b) const = 0; ' – WhozCraig

cevap

9

aksi halde bağımsız değişken bir BaseSort soyut olduğu için yasadışı tip BaseSort nesne, kopyala-inşa etme girişimi neden (değeriyle geçilecek, std::ref() kullanmak zorunda ilgili değil

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

@DrewDormann: Düzeltme için teşekkürler :) –

+1

' cppreference', 'std :: ref' yalnızca C++ 11 olduğunu söylüyor. insanlar std :: ref' önce onlar bu konuyla nasıl başa çıktı? – us2012

+1

@ us2012: Boost'un doğru bir şekilde hatırlamaması durumunda bir “boost :: ref” ve “boost :: cref” var. –

İlgili konular