Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник с,с++.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
68 Кб
Скачать
☆

Урок 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 (так как он возвращает указатель).

Результат сортировки будет, разумеется, таким же, как и в прошлый раз.