C++. Сборник рецептов - [181]

Шрифт
Интервал

, и вам нужно сконструировать вектор >std::vector, состоящий из объектов >Animal, представляющих животных, перечисленных в документе.

Пример 14.1. Документ XML со списком животных цирка

>

>

>

Herby

>  elephant

1992-04-23

Sheldon

parrot

1998-09-30

>  Dippy

penguin

2001-06-08

>

Пример 14.2 показывает, как может выглядеть определение класса >Animal. >Animal имеет пять данных-членов, соответствующих кличке, виду, дате рождения, ветеринару и дрессировщику животного. Кличка и вид животного представляются строками типа std::string, дата его рождения представляется типом >boost::gregorian::date из Boost.Date_Time, а его ветеринар и дрессировщик представляются экземплярами класса >Contact, который определен также в примере 14.2. Пример 14.3 показывает, как можно использовать >TinyXml для синтаксического анализа документа animals.xml, просмотра разобранного документа и заполнения вектора >std::vector объектов >Animal, используя извлеченные из документа данные.

Пример 14.2. Заголовочный файл animal.hpp

>#ifndef ANIMALS_HPP_INCLUDED

>#define ANIMALS_HPP_INCLUDED


>#include

>#include

>#include // runtime_error

>#include

>#include


>// Представляет ветеринара или дрессировщика

>class Contact {

>public:

> Contact() {}

> Contact(const std::string& name, const std::string& phone) :

>  name_(name) {

>  setPhone(phone);

> }

> std::string name() const { return name_; }

> std::string phone() const { return phone_; }

> void setName(const std::string& name) { name_ = name; }

> void setPhone(const std::string& phone) {

>  using namespace std;

>  using namespace boost;

>  // Используйте Boost.Regex, чтобы убедиться, что телефон

>  // задач в форме (ddd)ddd-dddd

>  static regex pattern("\\([0-9]{3}\\)[0-9]{3}-[0-9]{4}");

>  if (!regex_match(phone, pattern)) {

>   throw runtime_error(string("bad phone number:") + phone);

>  }

>  phone_ = phone;

> }

>private:

> std::string name_;

> std::string phone_;

>};


>// Сравнить на равенство два объекта класса Contact; используется в рецепте

>// 14.9 (для полноты следует также определить operator!=)

>bool operator--(const Contact& lhs, const Contact& rhs) {

> return lhs.name() == rhs.name() && lhs.phone() == rhs.phone();

>}


>// Записывает объект класса Contact в поток ostream

>std::ostream& operator(std::ostream& out, const Contact& contact) {

> out << contact.name() << " " << contact.phone(); return out;

>}


>// Класс Animal представляет животное

>class Animal {

>public:

> // Конструктор по умолчанию класса Animal; этот конструктор будет вами

> // использоваться чаще всего Animal() {}

> // Конструирование объекта Animal с указанием свойств животного;

> // этот конструктор будет использован в рецепте 14.9

> Animal(const std::string& name,

>  const std::string& species, const std::string& dob,

>  const Contact& vet, const Contact& trainer) :

>  name_(name), species_(species), vet_(vet), trainer_(trainer) {

>   setDateOfBirth(dob)

>  }

> // Функции доступа к свойствам животного

> std::string name() const { return name_; }

> std::string species() const { return species_; }

> boost::gregorian::date dateOfBirth() const { return dob_; )

> Contact veterinarian() const { return vet_; }

> Contact trainer() const { return trainer_; }


> // Функции задания свойств животного

> void setName(const std::string& name) { name_ = name; }

> void setSpecies(const std::string& species) { species_ = species; }

> void setDateOfBirth(const std::string& dob) {

>  dob_ = boost::gregorian::from_string(dob);

> }

> void setVeterinarian(const Contact& vet) { vet_ = vet; }

> void setTrainer(const Contact& trainer) { trainer_ = trainer; }

>private:

> std::string name_;

> std::string species_;

> boost::gregorian::date dob_;

> Contact vet_;

> Contact trainer_;

>};


>// Сравнение на равенство двух объектов Animal; используется в рецепте 14.9

>// (для полноты следует также определить operator!=)

>bool operator==(const Animal& lhs, const Animal& rhs) {

> return lhs.name() == rhs.name() && lhs.species() == rhs.species() &&

>  lhs.dateOfBirth() == rhs.dateOfBirth() &&

>  lhs.veterinarian() == rhs.veterinarian() &&

>  lhs.trainer() == rhs.trainer();

>}


>// Записывает объект Animal в поток ostream

>std::ostream& operator<<(std::ostream& out, const Animal& animal) {

> out << "Animal {\n"

>  << " name=" << animal.name() << ";\n"

>  << " species=" << animal.species() << ";\n"

>  << date-of-birth=" << animal.dateOfBirth() << ";\n"

>  << " veterinarian=" << animal.veterinarian() << ";\n"


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.