Wpis z mikrobloga

#naukaprogramowania #cplusplus
Mam klasę timer i tam w przerwaniu jest wywoływany callback. Coś takiego:

ISR(vector){
wskaźnik();
};

Podstawiam do wskaźnik adres funkcji i jest ok. Ale potrzebuje wstawić tam adres jednej z metod jednej z klas. Metoda zwraca void i przyjmuje void ale kompilator rzuca błędem:
Error cannot convert 'void (lcd_KS0108::*)()' to 'TPcallback {aka void (*)()}' in assignment
Error ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say '&lcd_KS0108::LightOFF' [-fpermissive]
Jak to powinienem rozwiązać?
  • 7
  • Odpowiedz
@Analityk: Najprościej to zadeklarować wskaźnik jako std::function i przypisać korzystając albo z lambdy albo std:bind łapiącej obiekt.
Jeżeli nie możesz zmienić tego wskaźnika, to musisz mieć statyczny obiekt lcdKS0108 i wtedy możesz przypisać tam labmdę
wskaźnik = [](){ lcdKS0108.LightOFF(); };
która to konwertuje się na void(*)().
Jak nie masz C++11 to niestety nie masz szczęścia i musisz zrobić statyczny adapter na tą twoją klasę, bo jeżeli metoda jest statyczna
  • Odpowiedz
@lionbest: Zrobiłem statyczne metody i pomogło, dzięki.
@KrzaQ2: Ale to jest tak, że mam klasę lcdKS0108 i obiekt tej klasy LcdKS1018. Jak podam LcdKS1018.Metoda to chyba wiadomo o którą metodę i którego obiektu się upominam? Skoro kompilator wnioskuje typy to czemu nie wnioskuje adresów?
  • Odpowiedz
@Analityk: Metoda nie jest przypisana do obiektu. Wskaźniki na funkcje mają dawać pewną abstrakcję (wiem jaka jest sygnatura, nie wiem konkretnie co zawołam), ale nie niosą ze sobą stanu. Jak chcesz z obiektem to masz lambdy albo std::bind, ale binda nie szanuj, lambdy zawsze lepsze
  • Odpowiedz
@Analityk:

nie podoba mi sie jak nazwy metod są wielką a nazwy obiektów małą

Bo to jakaś herezja jest, powinny być z małej, chyba że są statyczne, no to jeszcze rozumiem.

Dlaczego nie ma klas static?

Nie bardzo wiem oco ci chodzi. A co niby taka klasa miała by robić? Jeżeli myślisz o statycznym adapterze to niestety nie da się tego automatycznie zrobić. Nawet dla jednej metody nie da się zrobić
  • Odpowiedz