Отправляет email-рассылки с помощью сервиса Sendsay

Уроки по C/C++

  Все выпуски  

Уроки по C/C++


Информационный Канал Subscribe.Ru

Уроки по C/C++. Рассылки сайта progs.biz
Рассылка № 33
С Новым Годом и Рождеством!
 
Начало > C++ > Основы C++ > Урок 38

Джим Адамс. DirectX: продвинутая анимация.
Джим Адамс. DirectX: продвинутая анимация
Заказать на Озоне

Подробнее


Полные версии уроков (с картинками): урок 38.

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

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

Рассылки сайта progs.biz
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


PARKING.RU. Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый ВЫДЕЛЕННЫЙ ХОСТИНГ на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru


Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2004 сайт progs.biz
© 2002-2004 Алексеев Игорь

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cpplessons
Отписаться

В избранное