Информатика и технология программирования


Назад: Си++ = Си + классы + объектно-ориентированное - часть 3


Рассмотрим в качестве примера фрагмент класса двоичного файла, в котором обработка ошибок открытия файла вынесена за пределы класса - в производный класс.


// Класс двоичных файлов с " отложенной" функцией обработки ошибок


&#35include &#60fstream.h&#62
typedef int BOOL;
typedef long FPTR; // Тип - указатель в файле



class BinFile : public fstream
{
public:
BOOL Open(char *); // Открыть существующий


virtual int OnError(char *s)
{return NULL}; // Обработка ошибок открытия


// по умолчанию - отказ от дальнейших


}; // попыток открыть файл



BOOL BinFile::Open(char * s)
{
char ss[80];
strcpy(ss,s);
while (1)
{
open(ss,ios::in | ios::out | ios::binary);
if (good()) return 1;
if (!OnError(ss)) // Виртуальная функция в производном классе


return 0; // ищет другое подходящее имя файла


}
return 1;
}

Виртуальная функция в производном классе должна выполнить конкретный диалог, содержание которого в базовом классе не раскрывается. В качестве результата она должна загрузить строку в массив - имя нового файла. Если " пользователь" производного класса предполагает продолжать диалог, он может это сделать например, так


class MyFile : public BinFile
{
public:
virtual int OnError(char *s)
{
cout &#60&#60 " не могу открыть файл " &#60&#60 s &#60&#60 endl;
cout &#60&#60 " введите еще (CR-отказ):" ;
cin &#62&#62 s;
if (s[0]==0) return 0;
return 1;
}
};

Определить значения переменных после выполнения действий .


//------------------------------------------------------bk75-01.cpp


&#35include &#60string.h&#62
class a
{ int x;
public: a() { x = 0; }
a(int n) { x = n; }
int get() { return(x); }
};
class b : public a
{
public:
int get() { return (a::get()+1); }
b(int n) : a(n+1) {}
};
void z1()
{ a a1(10); b b1(12);
int x = a1.get(); int y = b1.get();
}
//------------------------------------------------------- 2


class aa
{ int x;
public:
aa() { x = 0; }
aa(int n) { x = n; }
int inc() { return(++x); }



Начало  Назад  Вперед