Functions and formatted printing of time and date for RTC8563

Dependencies:   mbed

You are viewing an older revision! See the latest version

Fragen Vererbung

Zurück C++ Seite

Sie haben folgende Klasse zur Verfügung:

SerialEventInh

#include "mbed.h"

// ---------------- Inherited Serial RS232 Event Class  --------------------------
const uint8_t STRMAX = 80;  
const char EOT = ';';
const char CRLF = '\n';
 
class SerialEventInh : public Serial {
        // Serial _pc;
        void _risingISR();
        char _str[STRMAX]; 
        volatile bool _strOkFlag;
        int _index;
 
    public:
        SerialEventInh() : Serial(USBTX, USBRX) { // create the Serial on the pin specified to SwEvent
            attach(callback(this, &SerialEventInh::pc_recv));        // attach DataReceive-function of this SerialEvent instance 
            _strOkFlag = false;
            _index=0;
        }

        SerialEventInh(PinName tx, PinName rx) : Serial(tx, rx) { // create the Serial on the pin specified to SwEvent
            attach(callback(this, &SerialEventInh::pc_recv));        // attach DataReceive-function of this SerialEvent instance 
            _strOkFlag = false;
            _index=0;
 
        }
        void pc_recv();
        void getString(char st[]);
        int checkFlag();                                    // must in do-condition (while(true)-loop) continuously interrogated
};

und der Implementierung der Methoden:

SerialEventInh Class Methodes

void SerialEventInh::getString(char st[]) {
    for( int i=0; i <= _index; i++)
        st[i] = _str[i];
    _index=0;
}
 
void SerialEventInh::pc_recv() {
    char c;
    while(readable()){
        c = getc();
        if((c != CRLF) && (_index < STRMAX)) {
            _str[_index++] = c;
        }
    }
    if(( c == EOT)) {           // end: . string not empty
        if(_index >= 1) {
            _strOkFlag = true;
            _str[--_index] = 0; 
        }
    }
}
 
int SerialEventInh::checkFlag() {
    if( _strOkFlag ) {
        _strOkFlag = false; 
        return 1;
    }
    return 0;
}

Aufgabe: Leiten Sie von obiger Klasse die Klasse ParsSerial ab, die den empfangenen String mit dem Trennzeichen Slash (/) auf mehrere char-Felder char* pFelder[ANZ_FELDER]; aufteilt. Die Instanziierung der Klasse und der Aufruf sollte folgendermassen aussehen:

ParsSerial ps;

int main() 
{
    char str[STRMAX];
    char* pFelder[ANZ_FELDER];

    while(1) {
        if(ps.checkFlag()) {
            ps.getString(str);
            printf("String: %s\n", str);
            ps.ParseFelder(str, pFelder, ANZ_FELDER, TRENNZEICHEN);
            printf("Str: %s  %s  %s\r\n", pFelder[0], pFelder[1], pFelder[2]);
        }
    }

Beispieleingabe: BT9/Raum903/PC01/;

Aufgabe: Erweitern Sie die SerialEventInh Klasse, sodass der folgende String in folgende Datentypen gewandelt wird: Int/Int/Int/Float

Beispieleingabe: 9/903/2/21.25/;

Aufgabe: Wie müssen die Konstruktoren in den Parent-Klassen implementiert werden, damit obige Intsanziierung ParsSerial ps; in Zeile 1 möglich ist?

  1. Welche Elemente (Member) hat eine Klasse?
  2. Welche Membervariablen werden unterschieden und welchen Zweck haben sie?
  3. Wie wird eine Klasseninstanz (Objekt) in C++ erzeugt? (Beispiel)
  4. Wie wird eine Klasseninstanz (Objekt) dynamisch in C++ erzeugt? (Beispiel)
  5. Wie werden Methoden in einem Objekt aufgerufen? Geben Sie ein Beispiel an.
  6. Wo und wie werden Methoden definiert?
  7. Was ist und wofür steht uint8_t?
  8. Wie wird verhindert, dass Codeteile doppelt durch den Präprozessor includiert werden?
  9. Zeichnen Sie ein UML Klassendiagramm, dass eine Klasse Time von der Basisklasse RTC8563 ableitet und GetTime als Methode beinhaltet. (siehe Klasse Date)
  10. Was wird unter Zugriffsspezifizierer bzw. Zugriffsmodifikatoren verstanden?
  11. Wer oder was kann auf den Memeber x in der folgenden Klasse zugreifen:

class foo {
public:
    int x();
}

12. Wer oder was kann auf den Memeber x in der folgenden Klasse zugreifen:

class foo {
	int x;
}

13. Was muss in der Basisklasse spezifiziert sein, damit in der abgeleiteten Klasse auf die Elemente der Basisklasse zugegriffen werden kann? (siehe Grundlagen der Vererbung)

14. Wie wird der Konstruktor vererbt?

15. Wie ist die Ausführungsreihenfolge der Konstruktoren, wenn ein Objekt der abgeleiteten Klasse instanziiert wird?

16. Was muss getan werden, wenn von einer Basisklasse kein Konstruktor vorhanden ist, der die gleichen Parameter hat wie der Konstruktor der abgeleitet Klasse? (siehe Beispiel)

17. Welche Teile der Methodendefinition dienen als Unterscheidungsmerkmal, wenn sie die Methode überladen wollen?

int foo( int x, int y ) 
{
  return 0;
}

18. Überladen Sie folgende Methode:

void Beschleunigen(int wert) 
{...}

19. Kann eine Klasse die beiden folgenden Methoden zur gleichen Zeit haben? (Begründung)

int function1( int x, int y ) {...}
float function1( int x, int y ) {...}

20. Was wird unter Initialisierungslisten verstanden? Geben Sie ein Beispiel in C++ an.

20a. Initialisieren Sie die Elemente der Klasse Date des folgenden parametrisierten Konstruktor mittels einerInitialisierungsliste:

Date(uint8_t _day, uint8_t _month, uint8_t _year)
{  
	day = _day;
	month = _month;
	year = _year;
}

21. Wie werden in einer abgeleiteten Klasse Methoden verborgen?

22. Was müssen Sie in der abgeleiten Klasse tun um eine Methode aus der Basisklasse zu Ihren Zwecken zu erweitern?

23. Werden vererbte Elemente und Methoden an nachfolgende Generationen weitergereicht?

24. Kann man in einer abgeleiteten Klasse eine public Methode aus der Basisklasse als privat deklarieren bzw. was passiert?

25. Wie kann man in C++ eine redefinierte Basismethode weiterhin aufrufen? (Beispiel)

26. Welche Aufgabe hat der this-Zeiger?

27. Warum deklariert man nicht alle Methoden einer Klasse als Virtuelle Methoden?

28. Angenommen sei eine virtuelle Methode Foo in der Basisklasse. Diese Methode wird überladen, einmal mit einem Integer-Wert und einmal mit zwei Integer-Werten. Die abgeleitete Klasse redefiniert die Version mit einem Integer-Wert. Welche Methode wird aktiviert, wenn ein Zeiger auf ein abgeleitetes Objekt die Version mit zwei Integer-Werten aufruft?

29. Was muss in der vorigen Frage getan werden, sodass die Methode mit zwei Integer-Werten aufgerufen werden kann?

30. Beispielhaft:

Schreiben sie zu dem UML-Diagramm in der Abbildung die zugehörige Klassendeklaration (Header-Datei).

/media/uploads/bulmecisco/uml_time.jpg

Zeichnen Sie zu folgendem C++-Code das UML-Klassendiagramm:

class A
{
protected:
    string test;
public:
    void Print(int anzahl, string r);
    void Print(string r);
};
class B : public A
{
private:
    int anzahl;
public:
    void Print(string nr);
    using A::Print;
};

All wikipages