<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=50&amp;t=12339&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-15T12:55:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=50&amp;t=12339&amp;mode</id>
<entry>
<author><name><![CDATA[mcmacpl]]></name></author>
<updated>2015-07-15T12:55:11+01:00</updated>
<published>2015-07-15T12:55:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12339&amp;p=134604#p134604</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12339&amp;p=134604#p134604"/>
<title type="html"><![CDATA[Re: Klasa statyczna czy nie? (prośba o wyjaśnienie)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12339&amp;p=134604#p134604"><![CDATA[
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: <!-- m --><a class="postlink" href="http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/PRG2CPP.html" >http://edu.pjwstk.edu.pl/wyklady/pro/sc ... G2CPP.html</a><!-- m --><br />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.<br /><br />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++ <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />W plikach *.h można implementować całe ciała metod klasy. Kompilator wtedy &quot;inlinuje&quot; kod takiej klasy. Tak się często także czyni jeśli masz szablony.<br /></div><br />To kiedy stosujemy słówko 'inline'?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10383">mcmacpl</a> — 15 lip 2015, o 12:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mcmacpl]]></name></author>
<updated>2015-07-15T07:53:33+01:00</updated>
<published>2015-07-15T07:53:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12339&amp;p=134581#p134581</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12339&amp;p=134581#p134581"/>
<title type="html"><![CDATA[Klasa statyczna czy nie? (prośba o wyjaśnienie)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12339&amp;p=134581#p134581"><![CDATA[
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...<br /><br />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.<br />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'.<br /><br />Oto przykład.<br /><br />Plik MirfSpiDriver.h<br />[syntax=cpp]class MirfSpiDriver {<br />public:<br />virtual uint8_t transfer(uint8_t data);<br />virtual void begin();<br />virtual void end();<br />};[/syntax]<br /><br />A teraz deklaracja konkretnego drivera - obsługującego sprzętowe rejestry SPI:<br />[syntax=cpp]#include &quot;MirfSpiDriver.h&quot;<br />#include &lt;SPI.h&gt;<br /><br />class MirfHardwareSpiDriver : public MirfSpiDriver {<br />public: <br />uint8_t transfer(uint8_t data) {<br />return SPI.transfer(data);<br />}<br /><br />void begin() {<br />SPI.begin();<br />SPI.setDataMode(SPI_MODE0);<br />SPI.setClockDivider(SPI_2XCLOCK_MASK);<br />}<br /><br />void end() {<br />}<br />};<br /><br />MirfHardwareSpiDriver MirfHardwareSpi;[/syntax]<br /><br />I tutaj pierwsze pytania: dlaczego ciała metod zadeklarowane są w pliku *.h ?<br />I czy deklaracja zmiennej:<br /><br /><span style="font-size: 85%; line-height: normal">MirfHardwareSpiDriver MirfHardwareSpi;</span><br /><br />powoduje powstanie instancji obiektu? Chyba nie. Instancja powstałaby chyba gdyby było:<br /><br /><span style="font-size: 85%; line-height: normal">MirfHardwareSpiDriver MirfHardwareSpi = MirfHardwareSpiDriver()</span>;<br /><br />Czyli klasa zachowuje się jak statyczna...<br /><br />Później mamy główną klasę do obsługi modułu NRF24L01 zadeklarowaną w sposób:<br />[syntax=cpp]class Nrf24l {<br />public:<br />Nrf24l();<br />void init();<br />// Spi interface (must extend spi).<br />MirfSpiDriver *spi;<br />};[/syntax]<br /><br />A potem w kodzie programu przekazujemy driver:<br />[syntax=cpp]// Set the SPI Driver.<br />  Mirf.spi = &amp;MirfHardwareSpi;[/syntax]<br /><br />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'?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10383">mcmacpl</a> — 15 lip 2015, o 07:53</p><hr />
]]></content>
</entry>
</feed>