Обратные вызовы в C++. Виталий Евгеньевич Ткаченко
Чтение книги онлайн.

Читать онлайн книгу Обратные вызовы в C++ - Виталий Евгеньевич Ткаченко страница 9

СКАЧАТЬ предназначенным для указателей на функцию. В этом случае метод класса в качестве контекста должен принимать нетипизированный указатель с последующим приведением типов. Пример использования показан в Листинг 8, инициатор здесь используется из Листинг 1 п. 2.1.2.

Листинг 8. Исполнитель с указателем на статический метод класса для инициатора с нетипизированным контекстом

      class Executor  // (1)

      {

      public:

        Executor()    // (2)

        {

            setup(callbackHandler, this);

        }

        static void callbackHandler(int eventID, void* somePointer)    // (3)

        {

            //It will be called by initiator

            Executor* executor = static_cast<Executor*>(somePointer);  // (4)

            executor->onCallbackHandler(eventID);

        }

      private:

        void onCallbackHandler(int eventID) // (5)

        {

            //Do what is necessary

        }

      };

      int main()           // (6)

      {

        Executor executor; // (7)

        run();             // (8)

        //Wait finish

      }

      Настройка обратного вызова осуществляется в конструкторе (строка 2). В обработчике обратного вызова (строка 3) мы делаем приведение типов (строка 4), чтобы получить указатель на экземпляр класса. В главной функции (строка 6) происходит запуск инициатора.

      2.2.4. Синхронный вызов

      Реализация инициатора для синхронного вызова приведена в Листинг 9. Как видим, она практически полностью повторяет реализацию, рассмотренную в предыдущей главе, только в качестве указателя на контекст используется указатель на экземпляр класса.

Листинг 9. Инициатор для синхронного обратного вызова с указателем на статический метод класса

      class Executor;

      using ptr_callback_static = void(*) (int, Executor*);

      void run(ptr_callback_static ptrCallback, Executor * contextData = nullptr)

      {

            int eventID = 0;

            //Some actions

            ptrCallback (eventID, contextData);

      }

      2.2.5. Преимущества и недостатки

      Преимущества и недостатки реализации обратных вызовов с помощью указателя на статический метод класса приведены в Табл. 2.

      Табл. 2. Преимущества и недостатки обратных вызовов с указателем на статический метод класса.

      Простая реализация. Не сложнее, чем для указателей на функцию.

      Совместим с инициатором в процедурном дизайне. Можно использовать для работы с системными API.

      Инициатор хранит контекст исполнителя. Так же, как и в случае указателей на функцию, усложняет реализацию и способствует увеличению расхода памяти.

      2.3. Указатель на метод-член класса

      2.3.1. Концепция

      В предыдущей главе мы рассматривали СКАЧАТЬ