МУ_ДЗ_2014 (1079920), страница 32
Текст из файла (страница 32)
BOOL HomeRemont ; // Требуется ли ремонт дома
int NumbApartament; // Число квартир// …
};
//////////////////////
// Класс улиц
//////////////////////
// Разница для массивов и списков только здесь !!! (нужное для массивов и списков перекомментировать)
class Street: public AbstrStreet , public CObArray {
//class Street: public AbstrStreet , public CArray <CObject *, CObject * >{
///////// Для списков кроме перекомментирования нужно изменить библиотеку DZ_LIB.cpp
// class Street: public AbstrStreet , public CObList {
// class Street: public AbstrStreet , public CList<CObject *, CObject * > {
public:
Street();
Street(const char *sName);
Street(const char *sNumbSearch, const char *sName);
Street(int Num);
Street(const char *sName , int Num);
Street(Street & S);
~Street() { };
// Перегрузка присваивания
Street operator =(Street & S);
// Виртуальные методы
public:
virtual int classType(){ return StreetClass;};
virtual char *className() {return "Street";};
virtual void printOn(ostream & out);
// Свойства класса Street
// Номер улицы – тип целый
public:
char *Name_Street;
int Homes_num;
int NumberStreet;
BOOL Remont; // для всех домов
BOOL RemontStreet;
StreetType StrType;
Street * ListOfNear; // соседние улицы - резервировано
// Методы класса Улиц - Street
void add(Home *pH, TypeAddDel = tail , int Numb = 1 , TypeAddDel = createObj);
void del( TypeAddDel = tail , int Numb = 1 , TypeAddDel = nodeleteObj);
// Получить и установить параметры улицы name,, no, NumberStreet
int GetNumberHome(){return (int) GetCount() ;};
int GetNumberMens(); //
char * GetNameStreet(){ return Name_Street;};
char * GetKeyNameStreet(){ return name;};
int GetNumbStreet(){ return NumberStreet;};
int GetKeyNumbStreet(){ return no;};
void SetNameStreet(const char * NameStr);
void SetKeyNameStreet(const char * sName);
void SetNumbStreet( int n ){ NumberStreet = n; return;};
void SetKeyNumbStreet( int k){ no = k; return;};
BOOL GetRemont();
BOOL GetRemontStr(){ return RemontStreet;};
void SetRemontStr(BOOL rS){ RemontStreet = rS; return;};
StreetType GetStreetType(){ return StrType;};
void SetStreetType(StreetType t){ StrType= t; return;};
// Дружественные функции
friend Street & operator +( Street & X , Street & Y );
};
Модуль - DZ_LIB.H (для массивов)
// DZ_LIB.cpp (для DZ_Array.cpp)
// Библиотека функций и методов для варианта с массивом (DZ_Array)
#include "stdafx.h"
#include <iostream>
using namespace std;
//////////////////////////////////
#include "DZ_Class.h"
//////////////////////////////////
class Home;
////////////////////////////
// Home - конструкторы
//////////////////////////// Класс Home
// Конструктор без параметров
Home::Home(): AbstrHome() {
Home_Number = NULL;
iHome = NULL;
no = NULL;
EtagCount = NULL;
MenCount = NULL;
TypeHome = fast;
NumbApartament = NULL;
HomeRemont = false;
};
//////////////////////////// Класс Home
// Класс Home: Деструктор
////////////////////////////
Home::~Home( )
{
if ( Home_Number != (char *)NULL) delete []Home_Number;
};
//////////////////////////// Класс Home
// Конструтрор копирования
Home::Home( Home & H): AbstrHome() {
no = 0;
if ( H.name != (char *)NULL )
{ name= new char[strlen(H.getName()) + 1];
strcpy_s(name , strlen(H.getName()) + 1 , H.getName());}
else
name = (char *)NULL;
if ( H.Home_Number != (char *)NULL )
{ Home_Number = new char[strlen(H.Home_Number) + 1];
strcpy_s(Home_Number , strlen(H.Home_Number) + 1, H.Home_Number); }
else
Home_Number = (char *)NULL;
iHome = H.iHome;
EtagCount = H.EtagCount;
MenCount = H.MenCount;
TypeHome = H.TypeHome;
NumbApartament = H.NumbApartament;
HomeRemont = H.HomeRemont;
};
//////////////////////////// Класс Home
// Конструктор: номер дома и имя для поиска (name)
Home::Home(const char *HomName, const char *Number) {
// Имя
if ( HomName != (char *)NULL )
{name= new char[strlen(HomName) + 1];
strcpy_s(name, strlen(HomName) + 1 , HomName);
}
else
name = (char *)NULL;
// Номер дома
if ( Number != (char *)NULL )
{Home_Number = new char[strlen(Number) + 1];
strcpy_s(Home_Number , strlen(Number) +1 , Number); }
else
Home_Number = (char *)NULL;
iHome = NULL;
EtagCount = NULL;
MenCount = NULL;
TypeHome = fast;
NumbApartament = NULL;
HomeRemont = false;
};
//////////////////////////// Класс Home
// Конструктор: номер дома и имя/номер для поиска (name)
Home::Home(const char *HomName, const char *Number, int Numb) {
// Имя
if ( HomName != (char *)NULL )
{name= new char[strlen(HomName) + 1];
strcpy_s(name , strlen(HomName) + 1, HomName); }
else
name = (char *)NULL;
// Номер
if ( Number != (char *)NULL )
{Home_Number = new char[strlen(Number) + 1];
strcpy_s(Home_Number , strlen(Number) + 1 , Number); }
else
Home_Number = (char *)NULL;
//
iHome = Numb;
EtagCount = NULL;
MenCount = NULL;
TypeHome = fast;
NumbApartament = NULL;
HomeRemont = false;
}
//////////////////////////// Класс Home
// Конструктор со всеми параметрами
Home::Home(const char *HomName, const char *Number, int Numb,
int Etag, int Men,HomeType Type,int Apart) {
//Имя
if ( HomName != (char *)NULL )
{name= new char[strlen(HomName) + 1];
strcpy_s(name , strlen(HomName) + 1, HomName); }
else
name = (char *)NULL;
// Номер
if ( Number != (char *)NULL )
{Home_Number = new char[strlen(Number) + 1];
strcpy_s(Home_Number , strlen(Number) +1 , Number); }
else
Home_Number = (char *)NULL;
//
iHome = Numb;
EtagCount = Etag;
MenCount = Men;
TypeHome = Type;
NumbApartament = Apart;
HomeRemont = false;
}
//////////////////////////// Класс Home
// Конструктор копирования
Home Home::operator =(Home & H ) {
// Имя
if ( H.name != (char *)NULL )
{ name= new char[strlen(H.getName()) + 1];
strcpy_s(name , strlen(H.getName()) + 1 , H.getName());}
else
name = (char *)NULL;
// Номер
if ( H.Home_Number != (char *)NULL )
{ Home_Number = new char[strlen(H.Home_Number) + 1];
strcpy_s(Home_Number , strlen(H.Home_Number) + 1, H.Home_Number); }
else
Home_Number = (char *)NULL;
//
iHome = H.iHome;
EtagCount = H.EtagCount;
MenCount = H.MenCount;
TypeHome = H.TypeHome;
NumbApartament = H.NumbApartament;
HomeRemont = H.HomeRemont;
return *this;
};
/////////////////////
// Методы класса Home
/////////////////////
// Метод печати дома
//////////////////
void Home::printOn(ostream & out) {
//
out << "Номер сп. -" <<no ;
if ( name !=(char *)NULL)
{out << " Имя - " << name << endl; }
else
{out << " Имя не задано " << endl; };
//
if ( Home_Number !=(char *)NULL)
out << "Номер сим. -" << Home_Number << endl;
else
{out << " Символьное имя не задано " << endl; };
//
out << " Номер -" << iHome << endl <<
"Этажей -" << EtagCount << " Жителей -" << MenCount << endl;
if (TypeHome == fast)
cout << "Тип дома - простой ";
if (TypeHome == multiple)
cout << "Тип дома - много строений ";
if (TypeHome == complex)
cout << "Тип дома - сложный ";
if ( HomeRemont ) cout << " Требуется ремонт! ";
else cout << " Ремонт не нужен! ";
cout << " Число квартир - " << NumbApartament << endl<< endl;
}
//////////////////////////// Класс Home
// Метод - Установить имя
//////////////////
void Home::setName(const char *HomName , const char *Number){
// Имя из базового класса - резерв для приска
if ( name != NULL)
delete []name;
if ( HomName != (char *)NULL )
{name= new char[strlen(HomName) + 1];
strcpy_s(name , strlen(HomName) + 1 , HomName); }
else
name = (char *)NULL;
// Имя дома
if ( Home_Number != NULL)
delete []Home_Number;
if ( Number != NULL)
{
Home_Number= new char[strlen(Number) + 1];
strcpy_s(Home_Number , strlen(Number) + 1 , Number);
}
else
Home_Number = (char *)NULL;
};
//////////////////////////// Класс Home
// Метод - Установить все параметры
//////////////////
void Home::setAllParam(const char *HomName , const char *Number, int iH, int Etag ,
int Men ,HomeType Type, int Apart , BOOL rem)
{
// Имя из базового класса - резерв для приска
if ( name != NULL)
delete []name;
if ( HomName != (char *)NULL )
{name= new char[strlen(HomName) + 1];
strcpy_s(name, strlen(HomName) + 1, HomName); }
else
name = (char *)NULL;
// Имя из базового класса - резерв для приска
if ( Home_Number != NULL)
delete []Home_Number;
if ( Number != NULL)
{
Home_Number= new char[strlen(Number) + 1];
strcpy_s(Home_Number , strlen(Number) + 1, Number) ;
}
else
Home_Number = (char *)NULL;
//
iHome= iH;
EtagCount= Etag;
MenCount= Men;
TypeHome = Type;
NumbApartament = Apart;
HomeRemont = rem;
};
// Методы дружественные - friend
//////////////////////////// Класс Home
// Перегрузка сложения домов
//////////////////
Home & operator +(Home & H1 , Home & H2)
{
Home *pTemp = new Home; // новый объект для сложения
//
pTemp->no = H1.no;
// Имя базового - сумма имен
pTemp->name = new char[strlen(H1.name) + strlen(H2.name)+ 5 ]; // учтем пробелы!
pTemp->name[0]='\0';
if (H1.name != NULL)
strcpy_s(pTemp->name, strlen(H1.name) + 1 , H1.name);
if (H2.name != NULL)
{
strcat_s(pTemp->name, strlen(H1.name) + strlen(H2.name)+ 5 ," + ");
strcat_s(pTemp->name, strlen(H1.name) + strlen(H2.name)+ 5 ,H2.name);
};
// Имя = сумма имен Home_Number
pTemp->Home_Number = new char[strlen(H1.Home_Number) + strlen(H2.Home_Number)+ 5 ];
pTemp->Home_Number[0]='\0';
if (H1.Home_Number != NULL)
strcpy_s(pTemp->Home_Number, strlen( H1.Home_Number ) + 1 , H1.Home_Number);
if (H2.Home_Number != NULL)
{
strcat_s(pTemp->Home_Number,strlen(H1.Home_Number) + strlen(H2.Home_Number)+ 5 ," + ");
strcat_s(pTemp->Home_Number,strlen(H1.Home_Number) + strlen(H2.Home_Number)+ 5 ,H2.Home_Number);
};
// Параметры
pTemp-> iHome = H1.iHome;
pTemp-> EtagCount = H1.EtagCount;
pTemp-> MenCount = H1.MenCount + H2.MenCount;
pTemp-> TypeHome = complex;
pTemp-> NumbApartament = H1.NumbApartament + H2.NumbApartament;
pTemp->HomeRemont = (H1.HomeRemont || H2.HomeRemont ) ? true : false ;
return *pTemp;