Конструктор - декомпрессор
Сначала посмотрим на очередность инициализации нашей версии Си
программы:
void decompressor_init(decompressor *dc, unsigned char *s, int len)
{
dc->p = s; dc->srclen = len; dc->rcnt = 0;
}
А теперь посмотрим на использование конструктора в версии C++:
decompressor::decompressor(unsigned char *s, int len)
{
p = s; srclen = len; rcnt = 0;
}
Отметим, что переменные p, scrlen, rcnt доступны непосредственно
в структуре, без каких-либо дополнительных указаний. Функции, принадлежащие классу, в Турбо и Borland С++ обладают таким свойством. Более
наглядно это проявляется в следующей функции декомпрессора next().
Decompressor::next() функция.
int decompressor::next(void)
{
if (rcnt && rcnt-- > 0) return c;// Рабочая длина для декомпрессора
if (!srclen || srclen-- <= 0) return -1; // Здесь конец
c = *p++; // Обработать следующий символ в буфере
if (c == 0xff) {
rcnt = *p++ - 1; // Уменьшить счетчик
c = *p++; // Здесь повторить символ
srclen -= 2;
}
return c;
}
Сравните эту версию с версией на Си. Borland С++ версия выглядит
более ясно и просто, не так ли?
Использование программой Borland С++ класса декомпрессора.
unsigned char buff[] = {'a',0xff,3,'b','c'};
main()
{ Объявление объекта декомпрессора,
с одновременной инициализацией.
int c; V
decompressor dc(buff, sizeof(buff));
while ((c = dc.next()) != -1) putchar(c);
return 0; ^
} Передача сообщения объекту
И так, мы только что выполнили конверсию программы из Си на С++.
В результате получен не просто преобразованный оригинал программы, а
ее объектно-ориентированное представление.