• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wywołanie metody klasy przez inną metodę tej klasy przy pomocy wskaźnika
#1
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();
      }
};
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości