C/C++ Урок 38. Сортировка с перегрузкой оператора
Чем был не слишком хорош рассмотренный на прошлом уроке метод сортировки? Тем, что мы в нем использовали внутреннее устройство класса класса CData:
...
if (GetAt(i)->a > GetAt(i+1)->a)
...
Видите, что мы тут делали? Мы предполагали, что класс CData содержит переменную 'a' (и он ее действительно содержит). А если мы поменяем класс CData? Например, переименуем эту переменную или захотим определять, кто больше, по другой переменной ('b'), или, скажем, перенесем переменную 'a' в закрытую часть класса и добавим метод GetA для доступа к этой переменной? Тогда нам придется менять и метод сортировки, и это не очень хорошо, так как надо помнить, что эти две части нашей программы как-то связаны.
Правильнее же будет поступить так: переопределить в самом классе CData, что такое для него означают знаки < и > (т. е. сделать перегрузку операторов < и >). Это можно сделать, например, так:
class CData
{
public:
...
bool operator>(CData v)
{
return a>v.a;
}
bool operator<(CData v)
{
return a<v.a;
}
};
И после этого изменить метод Sort:
void CList::Sort()
{
bool b; // Меняли ли соседние элементы списка?
do
{
b = false; // пока ничего не меняли.
// Смотрим элементы до предпоследнего.
for (int i = 0; i<GetCount()-1; i++)
{
if (*GetAt(i) > *GetAt(i+1))
{
Change(GetAt(i));
b = true;
}
}
}while (b);
}
По сравнению со старым методом мы тут только изменили метод сравнения - раньше мы сравнивали два экземпляра наших данных через переменную 'a' из класса CData, а сейчас мы сравниваем сами данные:
...
if (*GetAt(i) > *GetAt(i+1))
...
Обратите внимание, что мы разыменовываем значения, возвращаемые методом GetAt (так как он возвращает указатель).
Результат сортировки будет, разумеется, таким же, как и в прошлый раз.
|