Функции -элементы структуры
Рассмотрим пример со структурой, представляющей дату:
struct dat
{
int day,month,year;
int TestData(); // Проверка даты
void NextData(); // Добавить 1 день
void PlusData(int n) // Добавить n дней
{
while(n-- !=0) NextData();
}
};
static int mm[] = {31,28,31,30,31,30,31,31,30,31,30,31};
//----------- Проверка на корректность ------------------
int dat::TestData()
{
if (month ==2 && day==29 && year %4 ==0) return(1);
if (month ==0 || month > 12 || day ==0 || day >mm[month])
return(0);
return(1);
}
//----------- Следующая дата ----------------------------
void dat::NextData()
{
day++;
if (day <= mm[month]) return;
if (month ==2 && day==29 && year %4 ==0) return;
day=1;
month++;
if (month !=13) return;
month=1;
year++;
}
//--------- Основная программа --------------------------
void main()
{
dat a;
do cin << a.day << a.month << a.year;
while(a.TestData() ==0);
a.PlusData(17);
}
Как видно из примера, в качестве элементов структуры могут выступать функции. Такие элементы-функции имеют следующие особенности:
-тело функции может быть определено в самой структуре (функция PlusData ). В этом случае функция имеет стандартный вид;
-в определении структуры дается только прототип функции (заголовок с перечислением типов формальных параметров). Определение самой функции дается отдельно, при этом полное имя функции имеет вид
. имя_структуры::имя_функции
-в теле функции неявно определен один формальный параметр с именем this -указатель на структуру, для которой вызывается функция (В нашем примере это будет struct dat *this ). Элементы этой структуры доступны через явное использование этого указателя или неявно:
this->month = 5;
this->day++;
month = 5;
day++;
-для структурированной переменной вызов функции - элемента этой структуры имеет вид:
. имя_переменной.имя_функции (список_параметров)
Приведем фрагмент этой же программы в виде эквивалента на " классическом" Си:
void dat_PlusData(dat *this, int n)
//---------- Добавить n дней ----------------------------
{
while(n-- !=0) NextData(this);
}
void dat_NextData(dat *this)
//----------- Следующая дата ----------------------------
{
this->day++;
...
this->month=1;
this->year++;
}
//--------- Основная программа --------------------------
void main()
{ dat a;
...
dat_PlusData(&a,17);
}