" Это была удивительная страна. Поперек бежали прямые ручейки, а
аккуратные живые изгороди делили пространство между ручейками на равные
квадраты.
- По-моему, Зазеркалье страшно похоже на шахматную доску, - сказала
наконец Алиса. - Только фигур почему-то не видно... А, впрочем, вот и они!
- радостно закричала она, и сердце громко забилось у нее в груди.
- Здесь играют в шахматы! Весь этот мир - шахматы (если только,
конечно, это можно назвать миром)! Это одна большая-пребольшая партия."
Льюис Кэрролл. Алиса в Зазеркалье
|
Приветствую вас, уважаемые читатели!
Я получил e-mail от Andrew Ezhguroff c критикой оформления рассылки:
"Рассылка оформлена так, что читать ее вообще невозможно."
Замечание справедливо и с этого выпуска рассылка будет выходить в чуть более светлом
формате.
Спасибо за замечание, Андрей.
В предыдущем выпуске был приведён файл main.h проекта и теперь мы будем
постепенно рассматривать файлы, которые он включает. Файл definitions.h был
рассмотрен в 23-ем выпуске, поэтому сегодня рассмотрим файлы field.h и
field.cpp , которые вместе с файлами definitions.h и
main.h находятся в каталоге src .
//////////////////////////////////////////////////////////////////////
//
// field.h
//
// for world field
//
//
// XIII
//////////////////////////////////////////////////////////////////////
#ifndef _FIELD_H_
#define _FIELD_H_
#include "definitions.h"
#include "box.h"
class FIELD
{
public:
FIELD(); // set default size
FIELD(FSize x_size,FSize y_size,FSize z_size);
~FIELD();
// variables
FSize SizeX; // size of world
FSize SizeY;
FSize SizeZ;
BOX *World; // Hello World! =)
// functions
void init(); // initialize World
bool AllocateWorldMemory(); // get memory for World
void FreeWorldMemory(); // free memory for World
BOX* GetBox(FSize x_,FSize y_,FSize z_); // return the BOX by coordinates
};
#endif
|
//////////////////////////////////////////////////////////////////////
//
// field.cpp
//
// for world field
//
//
// XIII
//////////////////////////////////////////////////////////////////////
#ifndef _FIELD_CPP_
#define _FIELD_CPP_
#include "field.h"
FIELD::FIELD()
{
World=NULL;
SizeX=DEFAULT_X_SIZE;
SizeY=DEFAULT_Y_SIZE;
SizeZ=DEFAULT_Z_SIZE;
}
FIELD::FIELD(FSize x_size,FSize y_size,FSize z_size)
{
World-NULL;
SizeX=x_size;
SizeY=y_size;
SizeZ=z_size;
}
FIELD::~FIELD()
{
FreeWorldMemory();
}
void FIELD::init()
{
// initialize World
bool temp=AllocateWorldMemory();
if(!temp)
printf("Cant allocate memory for World\n");
}
bool FIELD::AllocateWorldMemory()
{
// get memory for World if OK return true
World=new BOX[SizeX*SizeY*SizeZ];
if(!World)
return false;
else
return true;
}
void FIELD::FreeWorldMemory()
{
// free memory for World
if(World)
{
delete []World;
World=NULL;
}
}
BOX* FIELD::GetBox(FSize x,FSize y,FSize z)
{
// return the BOX with coordinates x,y,z
return &World[_XYZ_(x,y,z)];
}
#endif //_FIELD_CPP_
|
Как видите описывается класс FIELD (ПОЛЕ), в котором определяются
размеры поля (типа FSize (см definitions.h )) по
x,y и z (SizeX,SizeY и SizeZ соответственно).
Само ПОЛЕ - это одномерным массив элементов типа BOX (КОРОБКА :) (который определён
в файле box.h ).
Описывается два конструктора; конструктор по умолчанию устанавливает размеры ПОЛя
по умолчанию (как они определены в definitions.h (SizeX=80, SizeY=20, SizeZ=1)). Второй конструктор
принимает три параметра - размеры ПОЛя, которые будут установлены.
Так же стоит обратить внимание на то, что выделенныя память освобождается в деструкторе,
но чтобы её выделить нужно вызвать функцию init() .
Функция GetBox(FSize x,FSize y,FSize z) , как Вы наверное уже догадались,
возвращает указатель КОРОБки с координатами {x,y,z}.
Счастливо!
|