|
Программирование >> Инициализация объектов класса, структура
class Screen { public: Screen Srepeat( Action = SScreen::forward, int = 1 ); ... выглядело бы следующим образом: Screen myScreen; myScreen.repeat(); repeat( SScreen::forward, 1 ); А ее вызовы так: myScreen.repeat( SScreen::down, 20 ); Определим таблицу указателей. В следующем примере Menu - это таблица указателей на функции-члены класса Screen, которые реализуют перемещение курсора. CursorMovements - перечисление, элементами которого являются номера в таблице Action::Menu() = { SScreen::home, SScreen::forward, SScreen::back, SScreen::up, SScreen::down, SScreen::end enum CursorMovements { HOME, FORWARD, BACK, UP, DOWN, END Menu. Можно определить перегруженную функцию-член move(), которая принимает параметр CursorMovements и использует таблицу Menu для вызова указанной функции-члена. Вот ее реализация: typedef ScreenS (Screen::Action)(); ScreenS Screen::repeat( Action op, int times ) { for ( int i = 0; i < times; ++i ) (this->*op)(); return *this; Параметр op - это указатель на функцию-член, которая должна вызываться times раз. Если бы нужно было задать значения аргументов по умолчанию, то объявление repeat() Screens Screen::move( CursorMovements cm ) ( this->*Menu[ cm ] )(); return *this; У оператора взятия индекса ([]) приоритет выше, чем у оператора указателя на функцию-член (->*). Первая инструкция в move() сначала по индексу выбирает из таблицы Menu нужную функцию-член, которая и вызывается с помощью указателя this и оператора указателя на функцию-член. move() можно применять в интерактивной программе, где пользователь выбирает вид перемещения курсора из отображаемого на экране меню. 13.6.3. Указатели на статические члены класса Между указателями на статические и нестатические члены класса есть разница. Синтаксис указателя на член класса не используется для обращения к статическому члену. Статические члены - это глобальные объекты и функции, принадлежащие классу. Указатели на них - это обычные указатели. (Напомним, что статической функции-члену не передается указатель this.) Объявление указателя на статический член класса выглядит так же, как и для указателя на объект, не являющийся членом класса. Для разыменования указателя никакой объект class Account { public: static void raiseInterest( double incr ); static double interest() { return interestRate ; } double amount() { return amount; } private: static double interestRate; double amount; string owner; inline void Account::raiseInterest( double incr ) { interestRate += incr; не требуется. Рассмотрим класс Account: это неправильный тип для s interestRate Тип s interestRate - это double*: double Account::* Определение указателя на s interestRate имеет вид: Account unit; / / используется обгчн оператор разыменования требуется: double daily = *pd / 365 * unit. amount; Однако, поскольку interestRate и amount - закрытые члены, необходимо иметь статическую функцию-член interest() и нестатическую amount() . правильно Указатель на interest() - это обычный указатель на функцию: double (*)() неправильно а не на функцию-член класса Account: double (Account::*)() Определение указателя и косвенный вызов interest() реализуются так же, как и для правильно: double(*pf)(), а не double(Account::*pf)() double(*pf)() = SAccount::interest; обычных указателей: double daily = pf() / 3 65 * unit.amount (); Упражнение 13.11 К какому тину принадлежат члены screen и cursor класса Screen? Упражнение 13.12 Определите указатель на член и инициализируйте его значением Screen:: screen; присвойте ему значение Screen:: cursor. Упражнение 13.13 Определите typedef для каждой из функций-членов класса Screen. Упражнение 13.14 правильно: double*, а не double Account::* double *pd = SAccount:: interestRate; Этот указатель разыменовывается так же, как и обычный, объект класса для этого не
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |