I am trying to pass a class internal function as a callback function within the class. The error behavior is similar to [this problem][1]. Whatsoever, I was unable to construct working code based on that question's answer. 

I try to pass over a callback function from within the class,in order to create a finite state machine, inspired by the examples I found on adafruit regarding multithreading. The idea is, that each state can call his successor. The class itself then represents the state machine and I just will call its update function.

While the following code does not resemble this utility, it resembles the problem in a minimal example (based on [this larger codepiece][2]):

    class MyClass
    {
      const byte theAnswer = 42;
      void (*myCallback)();
    
      void setCallback(void (*callback)())
      {
        myCallback = callback;
      }
      
      public:
      
      void print_info()
      {
        Serial.println(theAnswer);
      }
    
      void call()
      {
        myCallback();
      }
      
       MyClass()
      {
        setCallback(&MyClass::print_info);
      }
    };
    
    
    MyClass AClassOfItsOwn();
    
    void setup() 
    {
      Serial.begin(9600);
      while (! Serial); // Wait until Serial is ready
    }
    
    void loop() 
    {
      AClassOfItsOwn.call();
      return;
    }

I get the following error code returned:

> ...testscript.ino: In constructor 'MyClass::MyClass()':
> 
> testscript:25: error: no matching function for call to
> 'MyClass::setCallback(void (MyClass::*)())'
> 
>          setCallback(&MyClass::print_info);
> 
>                                          ^
> 
> ...\testscript.ino:25:41:
> note: candidate is:
> 
> ...\testscript.ino:6:12:
> note: void MyClass::setCallback(void (*)())
> 
>        void setCallback(void (*callback)())
> 
>             ^
> 
> ...\testscript.ino:6:12:
> note:   no known conversion for argument 1 from 'void (MyClass::*)()'
> to 'void (*)()'
> 
> ...\testscript.ino:
> In function 'void loop()':
> 
> testscript:40: error: request for member 'call' in 'AClassOfItsOwn',
> which is of non-class type 'MyClass()'
> 
>        AClassOfItsOwn.call();
> 
>                       ^
> 
> exit status 1 no matching function for call to
> 'MyClass::setCallback(void (MyClass::*)())'


----------
**fun times with polymorphism**
this is what I tried till now. I also tried creating an instance of this wrapper within the actual class to hold the callback, but that did not work either. Sorry I am a bit cumbersome with C++, coming from another language and apparently bit off a bit more than I could chew... 


    class CallbackWrapper
    {
      void (*myCallback)();
      public:
      
      void call()
      {
        myCallback();
      }

      void setCallback(void (*callback)())
      {
        myCallback = callback;
      }
    };
    
    class MyClass : public CallbackWrapper
    {
      const byte theAnswer = 42;
      public:
      
      void print_info()
      {
        Serial.println(theAnswer);
      }
      
       MyClass()
      {
        CallbackWrapper::setCallback(&MyClass::print_info);
      }
    };

trying to store the callback function in a wrapping class (also not working, `'((MyClass*)this)->MyClass::CBW' does not have class type`)

    class CallbackWrapper
    {
      void (*myCallback)();
      public:
      
      void call()
      { myCallback(); }

      void setCallback(void (*callback)())
      { myCallback = callback; }
    };
    
    class MyClass 
    {
      const byte theAnswer = 42;
      CallbackWrapper CBW();
      public:
      void print_info() { Serial.println(theAnswer); }
      void call() { CBW.call(); }
      MyClass()
      { CBW.setCallback(&MyClass::print_info); }
    };

An update on why I want to change the callback function during runtime. Here I try to randomly change the callback function:

    class MyClass 
    {
      CallbackWrapper CBW();
      public:
      void do_this() { Serial.println("doing this"); }
      void do_that() { Serial.println("doing that"); }
      void call() 
      { 
        CBW.call();
        if (rand() > 0.5)
        {
          CBW.setCallback(&MyClass::do_this)
        }
        else
        {
          CBW.setCallback(&MyClass::do_that)
        }
      }
       MyClass()
      {  }
    };


For discussion with Michail

    class CallbackWrapper
    {
      public:
      void (*myCallback)();
      void call()
      { myCallback(); }

      virtual void setCallback(void (*callback)())
      {  }
    };
    
    class MyClass : public CallbackWrapper
    {
      public:
      void setCallback(void (*callback)())
        { myCallback = callback; }
      void do_this() { Serial.println("doing this"); }
      void do_that() { Serial.println("doing that"); }
      void call() 
      { 
        CallbackWrapper::call();
        if (rand() > 0.5)
        { setCallback(&MyClass::do_this); }
        else
        { setCallback(&MyClass::do_that); }
      }
       MyClass()
      {  }
    };

  [1]: http://arduino.stackexchange.com/questions/14480/pass-a-member-function-pointer-to-a-method-of-a-foreign-class-edb-lib
  [2]: https://learn.adafruit.com/multi-tasking-the-arduino-part-3/put-it-all-together-dot-dot-dot