Arduino Polska Forum
Wywołanie metody klasy przez inną metodę tej klasy przy pomocy wskaźnika - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Wywołanie metody klasy przez inną metodę tej klasy przy pomocy wskaźnika (/watek-wywo%C5%82anie-metody-klasy-przez-inn%C4%85-metod%C4%99-tej-klasy-przy-pomocy-wska%C5%BAnika)



Wywołanie metody klasy przez inną metodę tej klasy przy pomocy wskaźnika - poeta Fikander - 18-03-2022

Dzień dobry. W oparciu o materiały ze strony embeddeddev.pl zrobiłem menu sterowane przyciskami, oparte o listę dwukierunkową. Mam strukturę elementu listy, listę elementów, funkcje sterujące i jest ok.
W ramach nauki chciałem to wszystko wrzucić do klasy. Stworzyłem więc klasę i mam kłopot. Nawigacja po menu w oparciu o klasę działa ale nie potrafię ogarnąć wywołania funkcji zwrotnych przypisanych do konkretnych elementów menu. 
Wykładam się na próbie wywołania metody obsługi elementu z metody wykorzystywanej do nawigacji. 

W metodzie 'enter' próbuję wywołać metodę 'clockCallback' przypisaną do elementu na poziomie jego definicji przy pomocy wskaźnika. Gdy próbuję wywołać metodę 'standardowo' to kompilator wyrzuca błąd 1, gdy wywołuję ją zgodnie z sugestią kompilatora dostaję błąd 2. 
Proszę o sugestię czy w ogóle da się to w ten sposób zrobić? Programowaniem arduino zajmuję się od niedawna i nie potrafię ocenić czy problem leży tylko w odpowiednim wywołaniu metody czy ogólnie sposób w jaki próbuję to zrobić jest zły?
Gdy w strukturze elementu zamiast wskaźnika do metody wstawię wskaźnik do funkcji zewnętrznej to bez problemu metoda 'enter' wywołuje tę funkcję i wszystko działa.

Kod:
typedef struct menuElement {
      const char *name;
      menuElement *prev;
      menuElement *next;
      menuElement *parent;
      menuElement *child;
      void (Menu::*callbackFn)();
} menuE;

class Menu {
    private:
      menuE menu1 = {"CLOCK", &menu2, &menu2, NULL, NULL, &Menu::clockCallback};
      menuE menu2 = {"TERMOMETER", &menu1, NULL, NULL, NULL, NULL};
      menuE *cPointer = &menu1;

    public:
      Menu() {}

      void clockCallback(){
            Serial.println("clockCallback");
      }

      void enter(){
            // 1 - error: must use '.*' or '->*' to call pointer-to-member function
            cPointer->callbackFn();

            // 2 - error: 'callbackFn' was not declared in this scope  
            cPointer->*callbackFn();
      }
};