Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 120

Автор Π”. БтСфСнс

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.1. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML со списком ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… Ρ†ΠΈΡ€ΠΊΠ°

<?xml version="1.0" encoding="UTF-8"?>

<!- Π–ΠΈΠ²ΠΎΡ‚Π½Ρ‹Π΅ Ρ†ΠΈΡ€ΠΊΠ° Feldman Family Circus -->

<animalList>

 <animal>

  <name>Herby</name>

  <species>elephant</species>

  <dateOfBirth>1992-04-23</dateOfBirth>

  <veterinarian name="Dr. Hal Brown" phone="(801)595-9627"/>

  <trainer name="Bob Fisk" phone=(801)881-2260"/>

 </animal>

 <animal>

  <name>Sheldon</name>

  <species>parrot</species>

  <dateOfBirth>1998-09-30</dateOfBirth>

  <veterinarian name="Dr Kevin Wilson" phone="(801)466-6498"/>

  <trainer name="Eli Wendel" phone="(801)929-2506"/>

 </animal>

 <animal>

  <name>Dippy</name>

  <species>penguin</species>

  <dateOfBirth>2001-06-08</dateOfBirth>

  <veterinarian name= "Dr. Barbara Swayne" phone="(801)459-7746"/>

  <trainer name="Ben Waxman" phone="(801)882-3549"/>

 </animal>

</animalList>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 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 <ostream>

#include <string>

#include <stdexcept> // runtime_error

#include <boost/date_time/gregorian/gregorian.hpp>

#include <boost/regex.hpp>


// ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ Π²Π΅Ρ‚Π΅Ρ€ΠΈΠ½Π°Ρ€Π° ΠΈΠ»ΠΈ дрСссировщика

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"

  << " trainer=" << animal.trainer() << ";\n"

  << "}";

 return out;

}

#endif // #ifndef ANIMALS_HPP_INCLUDED

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.3. БинтаксичСский Π°Π½Π°Π»ΠΈΠ· animals.xml с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ TinyXml

#include <exception>

#include <iostream>  // cout

#include <stdexcept> // runtime_error

#include <cstdlib>   // EXIT_FAILURE

#include <cstring>   // strcmp

#include <vector>

#include <tinyxml.h>

#include "animal.hpp"


using namespace std;


// Π˜Π·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ тСкстовоС содСрТимоС элСмСнта XML

const char* textValue("TiXmlElement* e) {

 TiXmlNode* first = fi->FirstChild();

 if (first != 0 && first == e->LastChild() &&

  first->Type() == TiXmlNode::TEXT) {

  // элСмСнт Β«Π΅Β» ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт Ρ‚ΠΈΠΏΠ° TEXT;

  // Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт

  return first->Value();

 } else {

  throw runtime_error(string("bad ") + e->Value() + " element");

 }

}


// ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Contact ΠΈΠ· элСмСнтов Π²Π΅Ρ‚Π΅Ρ€ΠΈΠ½Π°Ρ€Π° ΠΈΠ»ΠΈ

// дрСссировщика ("veterinarian" ΠΈΠ»ΠΈ "trainer")

Contact nodeToContact(TiXmlElement* contact) {

 using namespace std;

 const char *name, *phone;

 if (contact->FirstChild() == 0 &&

  (name = contact->Attribute("name")) &&

  (phone = contact->Attribute("phone"))) {

  // Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ contact Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠΌΠ΅Π½ΠΈ

  // ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° ("name" ΠΈ "phone"); ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ эти значСния для

  // конструирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Contact

  return Contact(name, phone);

 } else {

  throw runtime_error(string("bad ") + contact->Value() + " element");

 }

}


// ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Animal ΠΈΠ· элСмСнта ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ ("animal")

Animal nodeToAnimal(TiXmlElement* animal) {

 using namespace std;

 // Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ animal соотвСтствуСт элСмСнту "animal"

 if (strcmp(animal->Value(), "animal") != 0) {

  throw runtime_error(string("bad animal: ") + animal->Value());

 }

 Animal result; // Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

 TiXmlElement* element = animal->FirstChildElement();

 // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт ΠΊΠ»ΠΈΡ‡ΠΊΠΈ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ

 if (element && strcmp(element->Value(), "name") == 0) {

  // ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° animal являСтся ΠΊΠ»ΠΈΡ‡ΠΊΠ° (элСмСнт

  // name"); ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π΅ тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для установки ΠΊΠ»ΠΈΡ‡ΠΊΠΈ

  // Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ result

  result.setName(textValue(element));

 } else {

  throw runtime_error("no name attribute");

 }

 // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт Π²ΠΈΠ΄Π° ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ

 element = element->NextSiblingElement();

 if (element && strcmp(element->Value(), species") == 0) {

  // Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом animal являСтся Π²ΠΈΠ΄ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ

  // (элСмСнт "species"); ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для

  // установки Π²ΠΈΠ΄Π° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ result

  result.setSpecies(textValue(element));

 } else {

  throw runtime_error(""no species attribute");

 }

 // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт Π΄Π°Ρ‚Ρ‹ роТдСния

 element = element->NextSiblingElement();

 if (element && strcmp(element->Value(), "dateOfBirth") == 0) {

  // Π’Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом animal являСтся Π΄Π°Ρ‚Π° роТдСния

  // (элСмСнт "dateOfBirth"));

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для установки Π΄Π°Ρ‚Ρ‹

  // роТдСния Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ result

  result.setDateOfBirth(textValue(element));

 } else {

  throw runtime_error("no dateOfBirth attribute");