Functions and formatted printing of time and date for RTC8563
Dependencies: mbed
Klasse Date von RTC8563 ableiten
Das UML Diagramm zeigt die Ableitung der Klasse Date von der Basisklasse RTC8563
Die Klasse Date erbt alle Membervariable (i2c) und Methoden (rtc_read, ...) von der Basisklasse RTC8563:
Klassendeklaration¶
Die Klassendeklaration erfolgt in der Header-Datei Date.h (also der gleiche Name wie die Klasse):
#include "mbed.h" #include "const.h" #include "RTC8563.h" #ifndef DATE_H #define DATE_H class Date : public RTC8563 { private: uint8_t bcdToUint(uint8_t const nybbles); public: uint8_t GetDay(); }; #endif
- Es werden die notwendigen Header-Dateien mit den Praeprozessor-Direktiven inkludiert. (Zeile 1 bis 3)
- Ist die Konstante DATE_H nicht definiert, liefert diese Direktive 1 zurück, DATE_H wird definiert (Zeile 6) und der Code wird inkludiert bis zum #endif in Zeile 15, sonst nicht. Somit wird die Klassendeklaration nur einmal vom Praeprozessor im Projekt eingebunden (Zeile 5 und 15).
- Erzeugung neuer Klassen: In Zeile 7 erfolgt die Deklaration der Klasse "Date" abgeleitet von der Klasse "RTC8563" mittels ":" und dem Zugriffsspezifizierer public. Durch das public nach dem Doppelpunkt stehen der Klasse Date alle public und protected Member zur Verfügung. Achtung: wird nichts angegeben so wird per default private verwendet.
- In Zeile 10 erfolgt die Deklaration der Methode (Prototyping) bcdToUint, Zugriffsspezifizierer privat also nur innerhalb der Klasse sichtbar.
- In Zeile 12 erfolgt die Deklaration der öffentlichen Methode (Prototyping) GetDay, Zugriffsspezifizierer public also im ganzen Programm sichtbar.
- Die Klassendeklaration wird mit } und einem Strichpunkt (;) abgeschlossen.
Konstruktoren und Destruktoren werden nicht vererbt und müssen für die abgeleitete Klasse neu definiert werden.
Klassendefinition¶
In der Klassendefinition erfolgt die Definition der Methoden in der Source-Datei Date.cpp (also wieder der gleiche Name wie die Klasse):
#include "mbed.h" #include "const.h" #include "Date.h" uint8_t Date::bcdToUint(uint8_t const nybbles) // Wandelt BCD-Wert in Integer um { uint8_t result; result = (nybbles >> 4) * 10 + (nybbles & 0x0F); return result; } uint8_t Date :: GetDay() { uint8_t s = rtc_read(DAYS); return bcdToUint(s&0x3F); }
- Es werden wieder die notwendigen Header-Dateien mit den Praeprozessor-Direktiven inkludiert. (Zeile 1 - 3)
- Erzeugung neuer Methoden: In Zeile 5 erfolgt die Definition der Methoden mittels Scope-Operator (::) für die entsprechende Klasse (hier: Date :: bcdToUint()) und in Zeilen 7 - 9 steht der auszuführende Code.
- Der Datentype uint8_t (unsigned integer mit 8 bit und _t bedeutet, dass es sich um ein typedef handelt) entspricht dem unsigned char, allerdings wird garaniert, dass der Datentype 8 Bit hat. Es könnte bei anderen Systemen char z.B. 16 bit haben (siehe Fixed-width integer types).
- In den Zeilen 12 bis 16 wird die öffentliche Methode (steht in der Klassendeklaration in Date.h) GetDay() definiert.
Hauptprogramm¶
Im Hauptprogramm in der Source-Datei main.cpp wird schließlich das Objekt erzeugt (instanziiert):
int main() { Date rtc; // instanziieren des Objektes rtc pc.printf("Day: %i\n", rtc.GetDay());
- Es werden wieder die notwendigen Header-Dateien benötigt (nicht angezeigt)
- Instantiierung der Klasse: in Zeile 1 wird in main() ein Objekt rtc der Klasse Date erzeugt (instatiiert).
- Aufruf der Methode mittels Objektname (rtc) dem Punktoperator (".") und dem Methodennamen (GetDay) den runden Klammern () und einem ";" zum Trennen weiterer Befehle. In Zeile 5 wird der Aufruf direkt in der printf-Methode des Objektes pc ausgegeben.
Aufgabe¶
- Task_Date: Erweitern Sie die Date-Klasse nach folgendem UML-Diagramm um die Mehtoden GetMonth und GetYear. Überprüfen Sie mit der Abbildung Register organisation die UND-Verküpfungen, sodass nicht falsche Werte zurück gegeben werden.
Fragen¶
- Welche Elemente (Member) hat eine Klasse?
- Wie wird eine Klasseninstanz (Objekt) in C++ erzeugt? (Beispiel)
- Wie wird eine Klasseninstanz (Objekt) dynamisch in C++ erzeugt? (Beispiel)
- Wie werden Methoden in einem Objekt aufgerufen? Geben Sie ein Beispiel an.
- Wo und wie werden Methoden definiert?
- Was ist und wofür steht uint16_t?
- Wie wird verhindert, dass Codeteile doppelt durch den Präprozessor includiert werden?
- Zeichnen Sie ein UML Klassendiagramm, dass eine Klasse Time von der Basisklasse RTC8563 ableitet und GetTime als Methode beinhaltet.
- Was wird unter Zugriffsspezifizierer bzw. Zugriffsmodifikatoren verstanden?
- Wer oder was kann auf den Memeber x in der folgenden Klasse zugreifen:
class foo { public: int x(); }
11. Wer oder was kann auf den Memeber x in der folgenden Klasse zugreifen:
class foo { int x; }