FSST - Hardwarenahe Programmierung

Klasse DateString von Date ableiten

Inhalt

Im UML Diagramm ist die Ableitung der Klasse DateString von der Klasse Date, die wiederum von der Klasse RTC8563 abgeleitet ist, dargestellt.

DateString.h

Die Klasse DateString erbt alle public und protected Membervariable und Methoden der Klasse Date.
Der Code der Header-Datei der Klasse DateString sieht folgendermaßen aus:

#include "mbed.h"
#include "const.h"
#include "string"
#include "Date.h"

#ifndef DATESTRING_H
#define DATESTRING_H

class DateString : public Date
{
private:
    string day;
    string toString(uint8_t value);

public:
    DateString()
    {}
    uint8_t GetDay();      // 2. und 3. Methode überschreiben und erweitern
    uint8_t GetNextDay();  // 4. Neue Methode
    string GetDay(uint8_t value);  // 5. Überladen der Methode GetDay
    using Date::GetDay;    // 5. ermöglicht den Aufruf der Methode in Basisklasse Date, sonst Error 165
};
#endif

DateString.cpp


Der Code der Source-Datei der Klasse DateString sieht folgendermaßen aus:

#include "DateString.h"

string DateString::toString(uint8_t value)
{
    //return std::to_string(value); // C++ version 11
    char buffer[2];
    sprintf (buffer, "%d", value);  // ToString()
    return buffer;
}    

// 2. und 3. Überschreiben und erweitern der Methode GetDay aus der Basisklasse
uint8_t DateString::GetDay()
{
    uint8_t d = Date::GetDay();   // Aufruf von GetDay aus der Basisklasse Date
    d++;
    return d;
}

string DateString::GetDay(uint8_t value)
{
    day = "Date als String " + toString(value);
    return day;
}
// 4. Definieren einer neuer Methoden GetNextDay
uint8_t DateString::GetNextDay()
{
    uint8_t day = rtc_read(DAYS);
    return bcdToUint(day & 0x3F) + 1;
}

main.cpp

Und in main wird jetzt der komplexe Datentype (Klasse) DateString für die Instanziierung (Erzeugung) des Objketes rtc verwendet:

#include "mbed.h"
#include "const.h"
#include "RTC8563.h"
#include "string"
#include "Date.h"
#include "DateString.h"

Serial pc(USBTX, USBRX);
 
uint8_t year, month, day;

int main()
{
    DateString rtc;  // instanziieren des Objektes rtc
    pc.printf("Anzahl: %d", Date::GetAnzahl()); // Zugriff auf stat. Methode über Klassenname
    pc.printf("Anzahl: %d", rtc.GetAnzahl());   // Zugriff auf stat. Methode über Objektvariable
 
    while(1) {
        pc.printf("Date.Day: %i\n", rtc.GetDay());  // 1. Verwenden von Methoden der Basisklasse bzw. 2. und 3. überschreiben/erweitern
        pc.printf("DateString.NextDay: %d\n", rtc.GetNextDay()); // 4. Neue Methode GetNextDay
        pc.printf("DateString.GetDay: %s\n", rtc.GetDay(rtc.GetDay()));  // 5. Überladene Methode GetDay
        wait(1);
    }
}

Bei der Übersetzung kommt die Warning in Zeile 21 für printf:
Warning: Non-POD class type passed through ellipsis in "main.cpp", Line: 21, Col: 33
hat nur die Bedeutung, dass der Datentype (hier ein Objekt - komplexer Datentype) nicht mit "C" kompatibel ist.
POD (Plain Old Data)

Verwendung der Methoden

  1. Verwenden von Methoden der Basisklasse - public- oder protected Methode GetDay aus Date
  2. Überschreiben von Methoden der Basisklasse - es wird GetDay aus DateString aufgerufen und verdeckt GetDay aus Klasse Date
  3. Erweitern von Methoden der Basisklasse um die Methode GetDay zu erweitern; Aufruf aus Basisklasse Date::GetDay();
  4. Definieren neuer Methoden z.B. neue Methode GetNextDay in DateString
  5. Überladen von Methoden z.B. GetDay mit Parameter GetDay(uint8_t value); using Date::GetDay;
  6. Konstruktor und Vererbung, wobei Konstruktoren nicht vererbt werden!

Inhalt


All wikipages