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

1 ... 205 206 207 [ 208 ] 209 210 211 ... 395


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;

Этот указатель разыменовывается так же, как и обычный, объект класса для этого не



1 ... 205 206 207 [ 208 ] 209 210 211 ... 395

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