2015-11-19 3 views
0
class Pass{ 
    string passName; 
public: 
    friend bool sorted(const Pass &lhs, const Pass &rhs); 
} 
bool sorted(const Pass &lhs, const Pass &rhs) 
{ 
    return lhs.passName < rhs.passName; 
} 
class Agent{ 
    vector <Pass *> listPass; 
public: 
    void sortPass(); 
} 
void Agent::sortPass() 
{ 
     vector <Pass*>listSort = listPass; 
     vector <Pass*>::iterator ptr; 
     sort (listSort.begin(), listSort.end(), sorted); 
     for(ptr = listSort.begin(); ptr != listSort.end(); ptr++) 
      { 
      (*ptr)->display(); 
      } 
} 

Каковы возможные варианты сортировки списка Pass по его названию? Я реализовал код выше, но он не работает. Я получаю ошибку недействительного пользовательского преобразования от «Pass *» до const Pass &.Сортировочные элементы в векторе по названию

+0

Также вам не хватает; после объявления класса. –

+0

Как правило, указатели хранения в векторе - это не лучшая практика (если вы не уверены в этом), это может вызвать утечку памяти. –

ответ

0

Поскольку listSort является вектором указателей, вам необходимо выровнять sorted функции (и друг декларацию), чтобы принять указатели в качестве аргументов, например:

bool sorted(const Pass *lhs, const Pass *rhs) 
{ 
    return lhs->passName < rhs->passName; 
} 

и он будет работать.

друг декларация должна выглядеть следующим образом:

friend bool sorted(const Pass *lhs, const Pass *rhs); 
+0

Почему я получаю ошибку базового операнда '->' имеет не указательный тип 'const Pass' –

+0

Возможно, вы не обновили параметры функции, в вашей исходной функции, которую вы используете &, которая представляет ссылки, здесь я использую * который указывает указатели –

+0

Owh благодарит много, он работает: D –

-1

Моего предпочтение идет к перегрузке оператора < так, что вы будете иметь возможность сравнить 2 объектов пасса (если вам не нужен этот оператор для чего-нибудь еще). Таким образом, ваш вызов сортировки не понадобится последнему аргументу для сравнения, который я нахожу более приятным.

class Pass{ 
string passName; 
    public: 
inline bool operator< (const Pass &lhs, const Pass &rhs)){ return(lhs.passName < rhs.passName);} 
} 

sort (listSort.begin(), listSort.end()); 

Что касается остальных, то другие ответы должны решить ваши проблемы с компиляцией.

+0

Он не будет работать, если listSort является вектором указателей –

Смежные вопросы