Callback_05.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <iostream>
  2. #include <functional>
  3. using std::cout;
  4. using std::endl;
  5. /**********************************************************************************************
  6. *
  7. */
  8. class MyClass
  9. {
  10. public:
  11. MyClass() {
  12. private_x = 5;
  13. };
  14. int public_x = 12;
  15. private:
  16. int private_x;
  17. };
  18. /**********************************************************************************************
  19. *
  20. */
  21. class YourClass
  22. {
  23. public:
  24. YourClass()
  25. {
  26. private_y = 8;
  27. }
  28. private:
  29. int private_y;
  30. };
  31. /**********************************************************************************************
  32. *
  33. */
  34. void g(MyClass * a1, YourClass* a2) {
  35. printf("access both classes\n");
  36. printf("MyClass: %d\n", a1->public_x);
  37. printf("YourClass: private\n");
  38. }
  39. /**********************************************************************************************
  40. *
  41. */
  42. class EventHandler
  43. {
  44. public:
  45. std::function<void(MyClass*, YourClass*)> cb = nullptr;
  46. template<class T1, class T2>
  47. void addHandler(std::function<void(T1*, T2*)> callback)
  48. {
  49. cout << "Handler added..." << endl;
  50. cb = callback;
  51. }
  52. template<class T1, class T2>
  53. void call_cb(T1* myCl, T2* yourCl) {
  54. if(cb != nullptr)
  55. (cb)(myCl, yourCl);
  56. }
  57. };
  58. /**********************************************************************************************
  59. *
  60. */
  61. int main(int argc, char** argv)
  62. {
  63. MyClass* myClass = new MyClass();
  64. YourClass* yourClass = new YourClass();
  65. EventHandler* handler = new EventHandler();
  66. /*
  67. * Here is the compiler error
  68. */
  69. handler->addHandler(g);
  70. handler->call_cb(myClass, yourClass);
  71. }