ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн
Указатели на указатели
В нашем следующем примере мы рассмотрим массив указателей на объекты и по- кажем, как можно отсортировать эти указатели, основываясь на данных, содержа- щихся в объектах. Здесь появляется идея использования указателей на указатели. Мы также продемонстрируем, почему люди иногда теряют сон из-за указателей.
Задача следующей программы: создать массив указателей на объекты класса person. Она будет похожа на пример PTROBJS, но мы еще добавим варианты функ- ций order() и bsort() из примера PTRSORT для сортировки группы объектов класса person, основанной на алфавитном порядке имен. Вот листинг программы PERSORT:
// persort.cpp
// сортировка объектов через массив указателей на них
#include <iostream>
#include <string>
using namespace std;
///////////////////////////////////////////////////////////
class person // некоторый человек
{
protected:
string name; // имя
public:
void setName ( ) // установка имени
{ cout << "Введите имя: "; cin >> name; }
void printName ( ) // показ имени
{ cout << endl << name; }
string getName ( ) // получение имени
{ return name; }
};
///////////////////////////////////////////////////////////
int main ( )
{
void bsort ( person**, int ); // прототип функции
person* persPtr [ 100 ]; // массив указателей на person
int n = 0; // количество элементов в массиве
char choice; // переменная для ввода символа
do
{
persPtr [ n ] = new person; // создаем новый объект
persPtr [ n ]->setName ( ); // вводим имя
n++; // увеличиваем количество
cout << "Продолжаем ввод (y/n)?"; // спрашиваем, закончен ли ввод
cin >> choice;
}
while ( choice == 'y' );
cout << "\nНеотсортированный список:";
for ( int j = 0; j < n; j++ ) // покажем неотсортированный список
persPtr [ j ]->printName ( );
bsort ( persPtr, n ); // отсортируем указатели
cout << "\nОтсортированный список:";
for ( j = 0; j < n; j++ ) // покажем отсортированный список
persPtr [ j ]->printName ( );
cout << endl;
return 0;
}
///////////////////////////////////////////////////////////
void bsort ( person** pp, int n )
{
void order ( person**, person** ); // прототип функции
int j, k; // переменные для циклов
for ( j = 0; j < n - 1; j++ ) // внешний цикл
for ( k = j + 1; k < n; k++ ) // внутренний цикл
order ( pp + j, pp + k ); // сортируем два элемента
}
///////////////////////////////////////////////////////////
void order ( person** pp1, person** pp2 )
{
if( (*pp1)->getName ( ) > (*pp2)->getName ( ) ) // если первая строка больше второй,
{
person* tempptr = *pp1; // меняем их местами
*pp1 = *pp2;
*pp2 = tempptr;
}
}
После запуска программы запрашивается имя. Когда пользователь введет его, создается объект типа person и полю data присваивается имя, полученное от поль- зователя. В программе также хранятся в виде массива persPtr указатели на эти объекты.
Когда пользователь на запрос о продолжении ввода имен вводит букву «н», программа вызывает функцию bsort() для сортировки объектов типа person, осно- ванной на содержимом полей name. Вот небольшой пример работы с программой:
Введите имя: Иванов Продолжаем ввод (д/н)? д Введите имя: Петренко Продолжаем ввод (д/н)? д Введите имя: Абдурахманов Продолжаем ввод (д/н)? н Неотсортированный список:
Иванов Петренко
Абдурахманов
Отсортированный список:
Абдурахманов
Иванов
Петренко
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
