Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 27 gru 2024, o 12:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 15 lip 2015, o 07:53 
Offline
Nowy

Dołączył(a): 30 cze 2015
Posty: 13
Pomógł: 1

Witam wszystkich ekspertów i miłośników c++. Po latach programowania obiektowego w językach 'wysokiego poziomu' człowiek tak bardzo oddalił się od sprzętu, że teraz co drugie wyrażenie z c czy c++ powoduje zawieszanie się moich półkul mózgowych...

Analizuję ostatnio bibliotekę Mirf do obsługi modułu NRF24L01 poprzez SPI. Biblioteka ta jest napisana w taki sposób, że do sprzętu (SPI) odwołuje się poprzez klasę 'drivera'. Przy inicjacji programu można do Mirf-a przekazać swojego 'drivera' który będzie zajmował się obsługą sprzętu.
Przykład jest bardzo prosty, ale tutaj już nie rozumiem jak to działa. Wygląda to tak jakby klasa drivera była statyczna (nie wymagała instancjalizacji obiektu), ale w kodzie nie widzę nigdzie typowych deklaracji metod 'static' czy 'static inline'.

Oto przykład.

Plik MirfSpiDriver.h
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A teraz deklaracja konkretnego drivera - obsługującego sprzętowe rejestry SPI:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I tutaj pierwsze pytania: dlaczego ciała metod zadeklarowane są w pliku *.h ?
I czy deklaracja zmiennej:

MirfHardwareSpiDriver MirfHardwareSpi;

powoduje powstanie instancji obiektu? Chyba nie. Instancja powstałaby chyba gdyby było:

MirfHardwareSpiDriver MirfHardwareSpi = MirfHardwareSpiDriver();

Czyli klasa zachowuje się jak statyczna...

Później mamy główną klasę do obsługi modułu NRF24L01 zadeklarowaną w sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A potem w kodzie programu przekazujemy driver:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Driver SPI w klasie Nrf24l trzymany jest jako wskaźnik, a nie po prostu jako referencja. Znowu: wygląda mi to na klasę statyczną. Tylko dlaczego metody zadeklarowane są jako 'virtual' a nigdzie nie ma 'static'?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lip 2015, o 12:55 
Offline
Nowy

Dołączył(a): 30 cze 2015
Posty: 13
Pomógł: 1

Serdeczne dzięki za wyjaśnienia. Przyznam się, że jakieś pół godziny po napisaniu tego posta natrafiłem na całkiem nieźle (to znaczy dość szczegółowo oraz bardzo zrozumiale) napisany wykład: http://edu.pjwstk.edu.pl/wyklady/pro/sc ... G2CPP.html
I wtedy zrozumiałem samo zadeklarowanie zmiennej typu klasowego powoduje wywołanie konstruktora domyślnego. A kiedy doczytałem o konstruktorach kopiujących, oraz że przypisanie zmiennej klasowej na zasadzie a = b to wcale nie jest przekazanie referencji do obiektu, tylko utworzenie nowego i skopiowanie 'zawartości', to uświadomiłem sobie że C++ to jednak dalej C, a nie to w czym programowałem od kilkunastu lat.

Tak że przepraszam za zamieszanie. Jednak wyryte przez lata schematy myślowe nie poddają się tak łatwo. Gdyby nie AVR, to w moim wieku nie ośmieliłbym się już uczyć c/c++ :-)

Cytuj:
W plikach *.h można implementować całe ciała metod klasy. Kompilator wtedy "inlinuje" kod takiej klasy. Tak się często także czyni jeśli masz szablony.

To kiedy stosujemy słówko 'inline'?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO