В следующей программе показано, насколько полезной может быть средство динамической идентификации типов (RTTI). Здесь используется модифицированная версия иерархии классов геометрических фигур из главы 15, которая вычисляет площадь круга, треугольника и прямоугольника. В данной программе определена функция fасtorу(), предназначенная для создания экземпляра круга, треугольника или прямоугольника. Эта функция возвращает указатель на созданный объект. (Функция, которая генерирует объекты, иногда называется фабрикой объектов.) Конкретный тип создаваемого объекта определяется в результате обращения к функции rand() С++-генератора случайных чисел. Таким образом, мы не можем знать заранее, объект какого типа будет сгенерирован. Программа создает десять объектов и подсчитывает количество созданных фигур каждого типа. Поскольку при вызове функции fасtorу() может быть сгенерирована фигура любого типа, для определения типа реально созданного объекта в программе используется оператор typeid.

/* Демонстрация использования средства динамической идентификации типов.

*/

#include

#include

using namespace std;

class figure {

 protected:

  double x, y;

 public:

  figure(double i, double j) {

   x = i;

   У = j;

  }

  virtual double area() = 0;

};

class triangle : public figure {

 public:

  triangle(double i, double j) : figure(i, j) {}

  double area() {

   return x * 0.5 * y;

  }

};

class rectangle : public figure {

 public:

  rectangle(double i, double j) : figure (i, j) {}

  double area() { return x * y;}

};

class circle : public figure {

 public:

  circle(double i, double j=0) : figure(i, j) {}

  double area() {return 3.14 * x * x;}

};

// Фабрика объектов класса figure.

figure *factory()

{

 switch(rand() % 3 ) {

  case 0: return new circle (10.0);

  case 1: return new triangle (10.1, 5.3);

  case 2: return new rectangle (4.3, 5.7);

 }

 return 0;

}

int main()

{

 figure *p; // указатель на базовый класс

 int i;

 int t=0, r=0, c=0;

 // генерируем и подсчитываем объекты

 for(i=0; i<10; i++) {

  p = factory(); // генерируем объект

  cout << "Объект имеет тип " << typeid(*р).name();

  cout << ". ";

  // учитываем этот объект

  if(typeid(*р) == typeid(triangle)) t++;

  if(typeid(*p) == typeid(rectangle)) r++;

  if(typeid(*p) == typeid(circle)) c++;

  // отображаем площадь фигуры

  cout << "Площадь равна " << p->area() << endl;

 }

 cout << endl;

 cout << "Сгенерированы такие объекты:\n";

 cout << " треугольников: " << t << endl;

 cout << " прямоугольников: " << r << endl;

 cout << " кругов: " << с << endl;

 return 0;

}

Возможный результат выполнения этой программы таков.

Объект имеет тип class rectangle. Площадь равна 24.51

Объект имеет тип class rectangle. Площадь равна 24.51

Объект имеет тип class triangle. Площадь равна 26.765

Объект имеет тип class triangle. Площадь равна 26.765

Объект имеет тип class rectangle. Площадь равна 24.51

Объект имеет тип class triangle. Площадь равна 26.765

Объект имеет тип class circle. Площадь равна 314

Объект имеет тип class circle. Площадь равна 314

Объект имеет тип class triangle. Площадь равна 26.765

Объект имеет тип class rectangle. Площадь равна 24.51

Сгенерированы такие объекты:

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги