|
Программирование >> Инициализация объектов класса, структура
class Screen { public: inline ScreenS forward(); inline ScreenS back(); inline ScreenS end(); inline ScreenS up(); inline ScreenS down(); другие функции-члены не изменяются private: inline int row(); другие функции-члены не изменяются Функции-члены forward() и back() перемещают курсор на один символ. По достижении правого нижнего или левого верхнего угла экрана курсор переходит в inline ScreenS Screen::forward() { переместить cursor вперед на одну экранн позицию ++ cursor; если достигли конца экрана, перепрыгнуть в противоположный угол if ( cursor == screen.size() ) home(); return *this; inline ScreenS Screen::back() { переместить cursor назад на одну экранную позицию если достигли начала экрана, перепрыгнуть в противоположный угол if ( cursor == 0 ) end(); else -- cursor; return *this; противоположный угол. end() перемещает курсор в правый нижний угол экрана и является парной по inline ScreenS Screen::end() cursor = width * height - 1; return *this; отношению к функции-члену home() : Функции up() и down() перемещают курсор вверх и вниз на одну строку. По достижении верхней или нижней строки курсор остается на месте и подается звуковой сигнал: const char BELL = \007; inline Screens Screen::up() { переместить cursor на одну строку вверх ес уже наверху, остаться на месте и подать сигнал if ( row() == 1 ) наверху? cout << BELL << endl; else cursor -= width; return *this; inline Screens Screen::down() if ( row() == height ) внизу? cout << BELL << endl; else cursor += width; return *this; row() - это закрытая функция-член, которая используется в функциях up() и down() , inline int Screen::row() { вернуть текущую строку return ( cursor + width ) / height; возвращая номер строки, где находится курсор: Пользователи класса Screen попросили нас добавить функцию repeat (), которая Screen srepeat( char op, int times ) { switch( op ) { case DOWN: n раз вызвать Screen::down() break; case DOWN: n раз вызвать Screen::up() break; ... повторяет указанное действие n раз. Ее реализация могла бы выглядеть так: Такая реализация имеет ряд недостатков. В частности, предполагается, что функции-члены класса Screen останутся неизменными, поэтому при добавлении или удалении функции-члена repeat() необходимо модифицировать. Вторая проблема - размер функции. Поскольку приходится проверять все возможные функции-члены, то исходный текст становится громоздким и неоправданно сложным. В более общей реализации параметр op заменяется параметром типа указателя на функцию-член класса Screen. Теперь repeat() не должна сама устанавливать, какую int HeightIs() ; Если имеются глобальные функции HeightIs() и WidthIs() вида: int WidthIs(); pfi = HeightIs; то допустимо присваивание pfi адреса любой из этих переменных: pfi = WidthIs; В классе Screen также определены две функции доступа, height() и width() , не inline int Screen::height() { return height; } имеющие параметров и возвращающие значение типа int: inline int Screen::width() { return width; } Однако попытка присвоить их переменной pfi является нарушением типизации и влечет неверное присваивание: нарушение типизации pfi = SScreen::height; ошибку компиляции: В чем нарушение? У функций-членов есть дополнительный атрибут типа, отсутствующий у функций, не являющихся членами, - класс. Указатель на функцию-член должен соответствовать типу присваиваемой ему функции не в двух, а в трех отношениях: по тину и количеству формальных параметров; тину возвращаемого значения; тину класса, членом которого является функция. Несоответствие типов между двумя указателями - на функцию-член и на обычную функцию - обусловлено их разницей в представлении. В указателе на обычную функцию хранится ее адрес, который можно использовать для непосредственного вызова. (Указатели на функции рассматривались в разделе 7.9.) Указатель же на функцию-член операцию следует выполнить, и всю инструкцию switch можно удалить. Определение и использование указателей на члены класса - тема последующих подразделов. 13.6.1. Тип члена класса Указателю на функцию нельзя присвоить адрес функции-члена, даже если типы возвращаем1х значений и списки параметров полностью совпадают. Например, переменная pfi - это указатель на функцию без параметров, которая возвращает значение типа int: int (*pfi)();
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |