   C++
  


                  .        .   C++     ,     ,       .          ,      ,           .         (middle) , .. ,       C++,             .         ,   ,   ,   ,         .





 

   C++








     .   ,     (    ),           ?.   ,    ,     . ,  ,      ?.   ,   ,         . ,  ,     .  -        ,     ,  ,     ,    ? ,   ,   ,    ,       ,    ,        ,        ,       ,               ,      .

         :     .      , ,  ,     .       , ,  , ,   . .       ,     , ,   ,  ,                 ,       .

       ,              ,     - .    ,                .

        (middle) , . . ,       C++,           . ,       ,      ,        :          C++,     . ,           ,        ,      .

    ,   .      ,    .           C++.       ,       .        ,    C++,     .   ,            ,             .

  ,       C++,       ,     .         :

   C++;

   ,  ;

 -   ;

   ;

   C++;

     ,   .

    ,    .    (     )  ,    .  ,    C++ 17;                .        https://github.com/tkachenko-vitaliy/Callbacks (https://github.com/tkachenko-vitaliy/Callbacks),          .

     ,     5.5,      ,      C++ 17.

      ,       .




1.   





1.1.   





1.1.1.  


  .      .    ,  , ,   ,   .      ,        :   ( )     .   ,  ( ) ,       .        ,    ,     .

,     ,    .        ,     , . .    .       ,   , . .  ,     ,     .     ,   ( )  ,    .  ,    ( ) ,     .




1.1.2.    


        .



    ,   -        ,   ,            .


   :       ,    ,       .

       (. 1).    ,  - ,   .   ,        ,   .        .    ,   ,     , . .   .






. 1.   






1.1.3.    


        . 2.        ,     ,       .               ,        , . .     .  ,    .






. 2.    






1.2. ,     



  ,     ,     .




1.2.1.  


,          .      ,   , ,   . .   ?

            .     .         ,      ?          ?   ,     ,    ?

       , . . ,       .     ,        :         ;        ;  -             .      ,                -   ,   -   .

    ,           (. 3).      .     , . .         .        ,       .  ,       , ,  ,   .








. 3.      






1.2.2.   


,      ,       .    ,   , , ,   .   :    ,     .       ,   ,   , , ,     ?        , , .      ,   ?       ?

        . 4.        .   ,     .           ,     .  ,             .






. 4.      






1.2.3.  


,      .   ,   ?

       ,        .    ,        .       ?   :     ,       .         ?

 :     ,      .   ,  ,    STL,       .      ,      ,   :      ,      C++.  ,      ,         .

 ,       ,   ?    :      ,  ,  ;       ;        .

        . 5. ,     (,    ),    .     ,       .    ,         ,     .






. 5.      






1.2.4.   


,      ,        .           ,    .     ?     ,     .  ,         . ,       ,       ,         .

        . 6. ,   ,    .   ,      ,    ,       .        -,    . .






. 6.        



,    ,     .  ,   ,        .    ,       ,         .




1.3.   





1.3.1.   


     . 7.      :   .

   ,       ( ).    ,     ,     .

   ,    .     ,           .   ,    ,   ,     .             ,    ,  .






. 7.   



    .



: ,      .

: ,    .

:       .

:   .

 : ,       .

:    ,      .



          .

1.    ,      ?

2.   ?

3.   ?



        .  ,     ,     .




1.3.2. 


   ,    ,        .         ,    .      ,        .

      ,       ,      .  ,    .

      .      ,       .      ,             .  ,   ,        (. 8).       ,     ? -   ,       ,   .       ,   -   .  ,     .            ,       .






. 8.     






1.4.   





1.4.1.    


C            .    -         ,    ,     (   ).        ,      (   ).



    ,               .

    ,          .


        . 9.         Run,      ,       .     Run    ,      (Action),     .       ,   ,     . .






. 9.    : ) ; ) 



     ,      :             .        ,      -  .




1.4.2.    API


API (Application Programming interface,   )    ,   ,   ,        .     API.



 API       API.


  API    .



1.    .   ,       API.

2.      .         .

3.      .  C++  ,      .



   C++  API       .

 API:      ,    .  ,   ,     ,     API    .  ,  API      .        Windows API,       User32.dll.              .

C++ API:       C++.   , ++ API       ,       .   API     ,     C++. , ,     Python     C++,    Visual Basic   .

  API      C, . .            , ,  , ,   .    ,        ,     ,      (   ),    API.  -      C      ,      .




1.5. 


    ,   -        ,   ,            .   ,     , :  ;   ;  ;   .

       : , , , , .

              .          .

       C++ API.     API      .

  ,       .




2.  





2.1.   





2.1.1. 


            . 10.      ,       .                .          ,          .            ,      .






. 10.      






2.1.2. 


     1[2 -   (    )        :    ,       .].


 1.    

typedefvoid(*ptr_callback)(inteventID,void*pContextData);//(1)



ptr_callbackptrCallback=NULL;//(2)

void*contextData=NULL;//(3)



voidsetup(ptr_callbackpPtrCallback,void*pContextData)//(4)

{

ptrCallback=pPtrCallback;

contextData=pContextData;

}



voidrun() //(5)

{

inteventID=0;

//Someactions

ptrCallback(eventID,contextData);//(6)

}



  1      ,   2    ,   3     .   4     ,     .   5   ,       6      .  ,    1,      ,   , . .  ,      .      ;  ,             .    ,    ,      . .     .



,     - .     :           .    :         , . .    ;      - ;     .         - [3 -  ,         ,      .  -, -           .] ( 2).


 2.       - 

classInitiator//(1)

{

public:

usingptr_callback=void(*)(int,void*); //(2)



voidsetup(ptr_callbackpPtrCallback,void*pContextData)//(3)

{

ptrCallback=pPtrCallback;contextData=pContextData;//(4)

}



voidrun()// (5)

{

inteventID=0;

//Someactions

ptrCallback(eventID,contextData);//(6)

}

private:

ptr_callbackptrCallback=nullptr; //(7)

void*contextData=nullptr; //(8)

};



  1     ,   2      .   3    ,    (      )     7  8.   5   ,      6      .  ,      ,      .  ,         ,     .



,     C++,    - ,       .          ,    C?   ,          API,      API          (. . 1.4.2).




2.1.3. 


   ,      ,    3.


 3.      

structontextData//(1)

{

//somecontextdata

};



voidcallbackHandler(inteventID,void*somePointer) //(2)

{

//Itwillbecalledbyinitiator

ontextData*pContextData=(ontextData*)somePointer;//(3)

//Do something here

}



intmain() //(4)

{

ontextDataclientContext; //(5)

setup(callbackHandler,&clientContext);//(6)

run();//(7)

//Waitfinish

}



  1     .     ,       : , ,   . .   2      ,      ,    .     ,      :    ( ,     eventID),     .    ;     ,     ( 3).

,   4   ,      .   5   ;  6    ,       -    ;  7  .

   ,     - ,    4.  ,         ,     - ( 5),         .


 4.     - 

structontextData//(1)

{

//somecontextdata

};



voidcallbackHandler(inteventID,void*somePointer)//(2)

{

//Itwillbecalledbyinitiator

ontextData*pContextData=static_cast<ontextData*>(somePointer);//(3)casttocontext

//Do something here

}



intmain()//(4)

{

Initiatorinitiator; //(5)

ontextDataclientContext; //(6)

initiator.setup(callbackHandler,&clientContext);//(7)callbacksetup

initiator.run(); //(8)initiatorhasbeenrun

//Waitfinish

}




2.1.4.  


        5.  ,      :    ,        .


 5.         

usingptr_callback=void(*)(int,void*);



voidrun(ptr_callbackptrCallback,void*contextData=nullptr)

{

inteventID=0;

//Someactions

ptrCallback(eventID,contextData);

}




2.1.5.   


             . 1.



. 1.         






 .   ,    :  ,          .

   .          ,     

     C.       , . .    C,     ++.      C++,       ,   C,         . [4 -        embedded-.     Embedded-   ,    -     ,   .      ,      (   firmware)    C.        ,  firmware       ,        .        C++,  firmware,  ,   C    .]

    API.    ++,    API.  C++ API      ,   API     .

   .   ,     .        .

   .       ,     .       ,        .




2.2.     





2.2.1. 


             . 11.     ,      ,        .                 .       ,          .






. 11.        






2.2.2. 


         ,    .   ,    6,        ,         .


 6.       

classExecutor;//(1)



classInitiator//(2)

{

public:

usingptr_callback_static=void(*)(int,Executor*); //(3)



voidsetup(ptr_callback_staticpPtrCallback,Executor*pContextData)//(4)

{

ptrCallback=pPtrCallback;contextData=pContextData; //(5)

}



voidrun()//(6)

{

inteventID=0;

//Someactions

ptrCallback(eventID,contextData);//(7)

}



private:

ptr_callback_staticptrCallback=nullptr;//(8)

Executor*contextData=nullptr;//(9)

};



  1      .   2    ,   3          .   4     ,   (          )    8  9.   6   ,      7       c     .




2.2.3. 


     7.


 7.       

classExecutor //(1)

{

public:

Executor(Initiator*initiator)//(2)

{

initiator->setup(callbackHandler,this);

}



staticvoidcallbackHandler(inteventID,Executor*executor)//(3)

{

//Itwillbecalledbyinitiator

executor->onCallbackHandler(eventID); //(4)

}



private:

voidonCallbackHandler(inteventID)//(5)

{

//Dowhatisnecessary

}

};



intmain()//(6)

{

Initiatorinitiator; //(7)

Executorexecutor(&initiator);//(8)

initiator.run(); //(9)

//Waitfinish

}



  1    .   2     젖   ,     .[5 -     ,             main.       ,                .]

  3       .       (    eventID)    ,        .       ,     .  ,      ,     ()   ( 4).

,   6   ,      .   7  -;  8  - ,      ;  9   .

             ,     .                .      8,      1 . 2.1.2.


 8.            

classExecutor //(1)

{

public:

Executor()//(2)

{

setup(callbackHandler,this);

}



staticvoidcallbackHandler(inteventID,void*somePointer)//(3)

{

//Itwillbecalledbyinitiator

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

executor->onCallbackHandler(eventID);

}



private:

voidonCallbackHandler(inteventID) //(5)

{

//Dowhatisnecessary

}

};



intmain() //(6)

{

Executorexecutor; //(7)

run(); //(8)

//Waitfinish

}



      ( 2).     ( 3)     ( 4),      .    ( 6)   .




2.2.4.  


        9.  ,     ,    ,           .


 9.           

classExecutor;

usingptr_callback_static=void(*)(int,Executor*);



voidrun(ptr_callback_staticptrCallback,Executor*contextData=nullptr)

{

inteventID=0;

//Someactions

ptrCallback(eventID,contextData);

}




2.2.5.   


               . 2.



. 2.           






 .  ,     .

     .       API.

   .  ,       ,       .




2.3.   - 





2.3.1. 


          ,          .        - ,      ,    - ?           .

        -  (   )   . 12.     ,     ,      .               .       ,    .     ,       .






. 12.        - 






2.3.2. 


     10.


 10.     - 

classExecutor;//(1)



classInitiator//(2)

{

public:

usingptr_callback_method=void(Executor::*)(int);//(3)



voidsetup(Executor*argCallbackClass,ptr_callback_methodargCallbackMethod) //(4)

{

ptrCallbackClass=argCallbackClass;ptrCallbackMethod=argCallbackMethod;//(5)

}



voidrun()//(6)

{

inteventID=0;

//Someactions

(ptrCallbackClass->*ptrCallbackMethod)(eventID);//(7)

}



private:

Executor*ptrCallbackClass=nullptr; //(8)

ptr_callback_methodptrCallbackMethod=nullptr; // (9)

};



  1     .   2  -,   3     -.   4     ,   (        )    8  9.   6   ,      7       .




2.3.3. 


     11.


 11.     - 

classExecutor //(1)

{

public:

voidcallbackHandler(inteventID)//(2)

{

//Itwillbecalledbyinitiator

}

};



intmain() //(3)

{

Initiatorinitiator; //(4)

Executorexecutor;//(5)

initiator.setup(&executor,&Executor::callbackHandler);//(6)

initiator.run(); //(7)

}



  1  -.   2   ,       .       (    eventID).   3   ,      .   4  -,   5  -.   6    ,   7   .




2.3.4.  


       :   -,    ,   .     .

     -  ,     12.      . 13.


 12. -  

classExecutor

{

public:

virtualvoidcallbackHandler1(inteventID);

virtualvoidcallbackHandler2(inteventID);

};



classExecutor1:publicExecutor

{

public:

voidcallbackHandler1(inteventID)override;

};



classExecutor2:publicExecutor

{

public:

voidcallbackHandler2(inteventID)override;

};



classExecutor3:publicExecutor1,publicExecutor2

{

};






. 13.   -



,         -,     13.


 13.      

intmain()

{

Initiatorinitiator;

Executorexecutor;

Executor1executor1;

Executor2executor2;

Executor3executor3;



initiator.setup(&executor,&Executor::callbackHandler1);//(1)

initiator.setup(&executor,&Executor::callbackHandler2);//(2)

initiator.setup(&executor1,&Executor::callbackHandler1);//(3)

initiator.setup(&executor1,&Executor::callbackHandler2);//(4)

initiator.setup(&executor2,&Executor::callbackHandler1);//(5)

initiator.setup(&executor2,&Executor::callbackHandler2);//(6)



//initiator.setup(&executor3,&Executor::callbackHandler1);//Incorrect,baseclassisambiguous//(7)

//initiator.setup(&executor3,&Executor::callbackHandler2);//Incorrect,baseclassisambiguous//(8)



initiator.setup((Executor1*)&executor3,&Executor::callbackHandler1);//(9)

initiator.setup((Executor1*)&executor3,&Executor::callbackHandler2);//(10)

initiator.setup((Executor2*)&executor3,&Executor::callbackHandler1);//(11)

initiator.setup((Executor2*)&executor3,&Executor::callbackHandler2);//(12)

}



  1  2  :   ,    .

  3      Executor::callbackHandler1,     Executor1  ,    Executor1::callbackHandler1.

  4     Executor::callbackHandler2;  Executor1    (..   ),       Executor::callbackHandler2.

  5     Executor::callbackHandler1;  Executor2   ,       Executor::callbackHandler2.

  6     Executor::callbackHandler2;  Executor2  ,     Executor2:: callbackHandler2.

  Executor3   ,     [6 - ,     ,    .     (, Java, C#, Ruby  .)    .   ,  C++   ,      .].          ,      7  8,       ,   ,           Executor1   Executor2.  ,   ,      ,   .           -.     -   ,    ,        .

  9       Executor1      callbackHandler1.  Executor1   ,    .   10      callbackHandler2;  Executor1    ,       Executor::callbackHandler2.        Executor2,      11  12,    :  11      Executor:: callbackHandler1,    12      Executor2::callbackHandler2.



     . 3.



. 3.     






    ,              .




2.3.5.  


        14.     ,    ,      .


 14.         - 

class Executor;

using ptr_method_callback_t = void(Executor::*)(int);



void run(Executor* ptrClientCallbackClass, ptr_method_callback_t ptrClientCallbackMethod)

{

int eventID = 0;

//Some actions

(ptrClientCallbackClass->*ptrClientCallbackMethod)(eventID);

}




2.3.6.   


                . 4.



. 4.           - 






.     ,     .

  .    , -      .

.      .

     .      .          ,       ,            .   ,       :       ,      .

         .   .




2.4.  





2.4.1. 


   C++     ,      [7 -  ,    , .].

          . 14.     ,       ,      .         [8 -      .  ,  ,   .      ,    .].        ,    .     ,       .






. 14.       .






2.4.2. 


     (.  15),        ,   .


 15.  

classCallbackHandler

{

public:

voidoperator()(inteventID)//Thisisanoverloadedoperator

{

//Itwillbecalledbyserver

};

};



     16.


 16.    

classInitiator//(1)

{

public:

voidsetup(constCallbackHandler&callback)//(2)

{

callbackObject=callback;

}



voidrun()//(3)

{

inteventID=0;

//Someactions

callbackObject(eventID);//(4)

}



private:

CallbackHandlercallbackObject;//(5)

};



  1   -.   2     ,       .    -,    5.   3   ,      4    .  ,          .




2.4.3. 


     17.


 17.    

intmain()

{

Initiatorinitiator; //(1)

CallbackHandlerexecutor; //(2)

initiator.setup(executor); //(3)

initiator.run(); //(4)

}



  1   -,   2   ,   3  ,   4  .




2.4.4.  


        18.     ,       ,      .


 18.       

voidrun(CallbackHandler&callbackObject)

{

inteventID=0;

//Someactions

callbackObject(eventID);

}




2.4.5.   


            . 5.



. 5.         






 .    .       ,      .    .

.         .    ,    .

  .      ,       .

  .        ,      .      .     ,      .   ,         [9 -       ,      .].

  API.   :  API         .       ,     .

 .         .   ,       ,       , . .   .  ,           ,    (    ),     .    .




2.4.6. 


    ,       .      [10 -         .];     ;   ;     .      ,  ,     ,  ,    ,       .

   .    ,      ,        ( 19).


 19.   

#include<iostream>



intCalculate(inta,intb)

{

returna+b;

}



intmain()

{

inta,b;

std::cin>>a>>b;

intresult=Calculate(a,b);

std::cout<<result;

}



        .     [11 -       Microsoft Visual studio  19.23.28106.4.      ,    .],      ( 20):


 20.     :

intCalculate(inta,intb)

{

00007FF6DA741005andal,8 //1

returna+b;

00007FF6DA741008moveax,dwordptr[b]//2

00007FF6DA74100Cmovecx,dwordptr[a]//3

00007FF6DA741010addecx,eax//4

00007FF6DA741012moveax,ecx//5

}

00007FF6DA741014ret//6



intmain()

{

.

intresult=Calculate(a,b);

00007FF6DA741053movedx,dwordptr[b] //7

00007FF6DA741057movecx,dwordptr[a] //8

00007FF6DA74105BcallCalculate(07FF6DA741000h)  //9

00007FF6DA741060movdwordptr[result],eax //10

.



  7  8   a  b   .   9   .   1   ,   2  3     ,   4  ,   5     ,   6    ,   10       .

  ,      ( 21):


 21.     

int main()

{

.

intresult=Calculate(a,b);

00007FF7D5B11033movedx,dwordptr[b]

00007FF7D5B11037addedx,dwordptr[a]



 ,       :     b      a.     ,    .  ,   ?




2.5. -





2.5.1. 


-[12 -      -,    ++    lambda-expression,     -.]     , ,   ,       .  -,     ,    .

      -   . 15.     -  ,       ,   , - ,  .      -,      .   -     .        ,    .     ,    -    .






. 15.      -






2.5.2. 


    -  ?     ,      -    .           2.1.   -            ,        .

 ,  -   ,           .          .    ,   -  .  ,    ,             -,   , ,    .      ,       .  , ,    -        - (. 4.4.2)      STL (. 4.6.1).




2.5.3. 


    -,           .        (. 4.4.2), -     .     STL (. 4.5.1) -     .       4,   .




2.5.4.  


     -     ,     .      . 4.2.1.




2.5.5.   


        -   . 6.



. 6.        -






  .          .    ,     ,   ,       .   this,      , . .  -      (.    22). ,   ?

  .         .    ,        .          (4.7),     .


 22. -    this

classEventCounter

{

public:

voidAddEvent(unsignedintevent)

{

callCounter_++;

lastEvent_=event;

}

private:

unsignedintcallCounter_=0;

intlastEvent_=0;

};



classExecutor

{

public:

Executor(EventCounter*counter):counter_(counter)

{

autolambda=[this](inteventID)

{

//Itwillbecalledbyinitiator

counter_->AddEvent(eventID);

processEvent(eventID);

};

//Setuplambdaininitiator

}

private:

EventCounter*counter_;

voidprocessEvent(inteventID){/*Dosomething*/}

};




2.6. 


 C++         :

   ;

     ;

   - ;

  ;

 -.

      .   - ?     ,    .




3.  





3.1.  





3.1.1.  


,       .           ?     ,   , . .   .

      .



1.  .

2.   .

3.   ,   ,      .

4.      ,     .



   .

1.      ,    .         .

2.    ,            .     ,   ;       . , ,        ,      ?      :   ,   10  50 ,  ,      . ,   ,    ,    .             .

3.      .      ,      .       -      .      (/ )   (    ).

4.   . ,      ( ),     ( ),  .

,      .  ,               .         ,      .      ,     .




3.1.2.   


 ,       .      ,    ,         .

. ,      ,    .

 . ,         .      (      ),       .  ,      .

  .      ,       .  ,               

.      .

. ,        .

. ,      .          - .

. ,      .

 API.     API.

C++ API.    C++ API.



,   ,  .     .       ,      .




3.2.  





3.2.1.  


     .    ,     ,    , ,      (. 7.)



. 7.     

: ? ; ? ;     






     ?

.    , ,   - :      .     -,    .         ,       .        .

 .         :       ,      ,    ,     .    ,        API. -   :            ,     ,     .       ,       .      ,        .

  .         ,     .

.       - ,       ,     .        :        ,    ,     ,          .      ,      ,       .

.       ,       .      ,          .

.   -     (  ), -    (         ).     .




  .


   .

   ,     (https://www.litres.ru/vitaliy-evgenevich-tkachenko/obratnye-vyzovy-v-c/)  .

      Visa, MasterCard, Maestro,    ,   ,     ,  PayPal, WebMoney, ., QIWI ,       .



notes



2


  (    )        :    ,       .




3


 ,         ,      .  -, -           .




4


       embedded-.     Embedded-   ,    -     ,   .      ,      (   firmware)    C.        ,  firmware       ,        .        C++,  firmware,  ,   C    .




5


    ,             main.       ,                .




6


,     ,    .     (, Java, C#, Ruby  .)    .   ,  C++   ,      .




7


 ,    , .




8


     .  ,  ,   .      ,    .




9


      ,      .




10


        .




11


      Microsoft Visual studio  19.23.28106.4.      ,    .




12


     -,    ++    lambda-expression,     -.


