ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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. Вот небольшой пример работы с программой:

Введите имя: Иванов Продолжаем ввод (д/н)? д Введите имя: Петренко Продолжаем ввод (д/н)? д Введите имя: Абдурахманов Продолжаем ввод (д/н)? н Неотсортированный список:

Иванов Петренко

Абдурахманов

Отсортированный список:

Абдурахманов

Иванов

Петренко

 

40