Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Листинг 14.11. Массив указателей на функции-члены






    1: // Листинг 14.11. Массивы указателей на функции-члены

    2:

    3: #include < iostream.h>

    4:

    5: class Dog

    6: {

    7: public:

    8: void Speak()const { cout < < " Woof! \n"; }

    9: void Move() const { cout < < " Walking to heel...\n"; }

    10: void Eat() const { cout < < " Gobbling food...\n"; }

    11: void Growl() const { cout < < " Grrrrr\n"; }

    12: void Whimper() const { cout < < " Whining noises...\n"; }

    13: void RollOver() const { cout < < " Rolling over...\n"; }

    14: void PlayDead() const { cout < < " Is this the end of Little Caesar? \n";

    15: };

    16:

    17: typedef void (Dog:: *PDF)()const;

    18: int main()

    19: {

    20: const int MaxFuncs = 7;

    21: PDF DogFunctions[MaxFuncs] =

    22: { Dog:: Speak,

    23: Dog:: Move,

    24: Dog:: Eat,

    25: Dog:: Growl,

    26: Dog:: Whimper,

    27: Dog:: RollOver,

    28: Dog:: PlayDead };

    29:

    30: Dog* pDog =0;

    31: int Method;

    32: bool fQuit = false;

    33:

    34: while (! fQuit)

    35: {

    36: cout < < " (0)Quit (1)Speak (2)Move (3)Eat (4)Growl";

    37: cout < < " (5)Whimper (6)Roll Over (7)Play Dead: ";

    38: cin > > Method;

    39: if (Method == 0)

    40: {

    41: fQuit = true;

    42: }

    43: else

    44: {

    45: pDog = new Dog;

    46: (pDog-> *DogFunctions[Method-1])();

    47: delete pDog;

    48: }

    49: }

    50: return 0;

    51: }

     

    Результат:

    (0)Quit (1)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll 0ver (7)Play

    Dead: 1

    Woof!

    (0)Quit (1)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll 0ver (7)Play

    Dead: 4

    Grrr

    (0)Quit (1)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll 0ver (7)Play

    Dead: 7

    Is this the end of Little Caesar?

    (0)Quit (1)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll 0ver (7)Play

    Dead: 0

     

    Анализ: В строках 5—15 создается класс Dog, содержащий семь функций-членов, характеризующихся одинаковыми сигнатурой и типом возврата. В строке 17 с помощью typedef объявляется тип PDF константных указателей на функции-члены Dog, которые не принимают и не возвращают никаких значений.

    В строках 21-28 объявляется массив DogFunctions, предназначенный для хранения указателей на семь функций-членов.

    В строках 36 и 37 пользователю предлагается выбрать метод. Выбор любого элемента, кроме Quit, приводит к созданию объекта класса Dog, после чего из массива вызывается соответствующий метод (строка 46). Ниже представлена еще одна строка, которая может немного смутить ваших знакомых программистов, работающих с C++:

    (pDog-> *-DogFunctions[Method-1])();

    Это выражение, безусловно, немного экзотично, но с его помощью можно создать таблицу функций-членов, что сделает код программы проще и читабельнее.

     

    Рекомендуется: Используйте указатели на функции- члены для вызова методов в объектах класса. Используйте typedef, чтобы упростить объявление указателя на функцию-член.

     

    Не рекомендуется: Не злоупотребляйте созданием указателей на функции-члены, если беэ них можно обойтись.

     

     

    Резюме

     

    Сегодня вы познакомились с созданием статических переменных-членов класса, которые, в отличие от обычных переменных-членов, принадлежат всему классу, а не отдельному объекту. Если статическая переменная-член объявлена как public, то обратиться к ней можно просто по имени, даже не используя объектов класса, которому принадлежит эта переменная.

    Статические переменные-члены можно использовать в качестве счетчиков объектов класса. Поскольку они не являются частями объектов, при их объявлении не происходит автоматическое резервирование памяти, как при объявлении обычных переменных-членов. Поэтому в программе за пределами объявления класса обязательно должна быть строка, в которой происходит определение и инициализация статической переменной-члена.

    Статические функции-члены также принадлежат всему классу, подобно статическим переменным-членам. Вызвать статическую функцию-член класса можно даже в том случае, если не было создано ни одного объекта этого класса. Сами же эти функции могут использоваться для открытия доступа к статическим переменным-членам. Поскольку статические переменные-члены не имеют указателя this, они не могут использовать обычные переменные-члены.

    Из-за отсутствия указателя this статические функции-члены не могут объявляться как const. Дело в том, что при объявлении функции-члена со спецификатором const устанавливается, что указатель this этой функции является константным.

    Кроме того, вы узнали, как объявлять и использовать указатели на обычные функции и на функции-члены, а также познакомились с созданием массивов этих указателей и с передачей указателей на функции в другие функции.

    Как указатели на функции, так и указатели на функции-члены могут использоваться для создания таблиц функций, что облегчает управление их вызовом в процессе выполнения программы. Это придает программе гибкость и делает программный код более читабельным.

     

    Вопросы и ответы

     

    Зачем использовать статические данные, если есть глобальные?

    Область видимости статических данных ограничивается классом. Обращаться к статической переменной-члену следует из объектов класса, либо из внешнего кода программы, явно указав имя класса (в случае, если статическая переменная-член описана как public), либо с помощью открытой статической функции-члена этого класса. Статические переменные-члены относятся к типу данных того класса, которому они

    принадлежат. Ограничение доступа к членам класса, вызванное строгим контролем за типом данных в C++, делает использование статических переменных-членов более безопасным по сравнению с глобальными данными.

    Зачем использовать статические функции-члены, если можно воспользоваться глобальными функциями?

    Статические функции-члены принадлежат классу и могут вызываться только с помощью объектов класса или с явным указанием имени класса, например:

    ClassName:: FunctionName().

    Насколько часто в программах используются указатели на функции и указатели на функции-члены?

    Такие указатели используются достаточно редко. Это дело вкуса программиста. Даже в сложных и мощных программах без них можно вполне обойтись.

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.