Dies ist eine alte Version des Dokuments!
In dieser Aufgabe gehen wir davon aus, dass ihr Grundkenntnisse über Klassen in Java/Processing habt im Umfang der 3. WocheLINK des Crashkurses.
In Arduino kann man auch mit Klassen arbeiten. Im Folgenden wollen wir auf dem Piezo unterschiedliche Melodien abspielen und diese mit Hilfe einer Klasse Song
modellieren. Baut eine Schaltung mit dem Piezo auf.
Jeder Song hat zwei Eigenschaften: die Liste von abzuspielenden Noten in Form eines int
-Arrays und der Pin, welcher mit dem Piezo verbunden ist.
Eine Klasse in C++ besteht in der Regel aus zwei Dateien: einer Header-Datei .h
, die alle Variablen, Konstruktoren und Methoden benannt werden, und einer .cpp
-Datei, die die eigentliche Impementieriung der Methoden beihnaltet. In unserem Beispiel kann die Klasse so aussehen:
class Song { public: Song(); // Konstruktor, muss noch mit Parametern versehen werden void play(); // Methode zum Abspielen der Melodie private: int notes[]; // Noten-Frequenzen in Hz int pin; // Piezo-Pin };
#include "Song.h" Song::Song() { // TODO: Implementierung des Konstruktors fehlt } void Song::play() { // TODO: Implementierung der Funktion fehlt }
Diese Aufteilung klingt vielleicht verwirrend am Anfang. Gründe dafür sind die historische Entwicklung von C++ und die Idee, die Schnittstelle von der Implementierung zu trennen. Z.B. wenn man im Team arbeitet, kann man die Header-Dateien als Schnittstellen an Andere übergeben, während an der Implementierung noch gearbeitet wird. Theoretisch kann man auch alles in einer Datei schreiben; Die Aufteilung in mehrere Dateien ist für die Übersichtlichkeit empfohlen.
Ihr sieht oben, dass die Header-Datei zwei Blöcke hat, die mit public
und private
anfangen. Diese Schlüsselworte weisen auf die Sichtbarkeit der Variablen und Funktionen hin. Public
bedeutet, dass die Variable/Funktion nur innerhalb der Klasse sichtbar ist, protected
innerhalb der Klasse und ihrer Unterklassen, public
überall. (Ähnliche Ebenen gibt es übrigens auch in Java.) Der Faustregel ist, die Sichtbarkeit möglichst begrenzt zu wählen. Die Begründung ist die gleiche wie bei globalen und lokalen Variablen: Je mehr Stellen haben Zugriff auf die Variable, desto mehr fehleranfällig ist der Code. Wir machen den Konstruktor und die Funktion play()
public
, damit wir darauf von unserem Haupt-Tab zugreifen können. Die beiden Variablen sind private
, sie sollen nur innerhalb der Klasse verfügbar sein. Es ist üblich, in der Header-Datei den public
-Block ganz oben zu platzieren.