Программирование >>  Инициализация объектов класса, структура 

1 ... 203 204 205 [ 206 ] 207 208 209 ... 395


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)();



1 ... 203 204 205 [ 206 ] 207 208 209 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика