Sie sind auf Seite 1von 3

Objektorientierte Programmierung, Algorithmen

und Datenstrukturen
bung 2
Sommer 2013
Prof. Dr.-Ing. Rolf-Rainer Grigat
S. Painer, M. Schrenberg

1. Aufgabe: Klasse CCounter


Hinweis: Bei der Erstellung des neuen Projektes ist es zwingend erforderlich die in der
Aufgabe 1 aus bung 1 beschriebene Vorgehensweise zu beachten. Ansonsten knnte es
Probleme mit dem Unit-Test geben. Benennen Sie die Files entsprechend der Konvention
im Skript anhand des Klassennamens CCounter.cpp und CCounter.h, dann brauchen
Sie die Files spter fr den Test nicht umbenennen.
Entwerfen Sie eine C++-Klasse CCounter, die einen Zhler implementiert. Die Klasse
soll die folgenden ffentlichen Methoden bereitstellen:
void count()
int getValue()
void setValue(int value)
Die Klasse soll als private Integer-Membervariable den Zhlerstand beinhalten, auf den
die ffentlichen Methoden zugreifen. Der Zhlerstand soll mit 0 initialisiert werden. Die
Methode
void count() soll den Zhlerstand um 1 erhhen. Die Methode
int getValue() soll den Zhlerstand zurckgeben und mit der Methode
void setValue(int value) soll es mglich sein, den Zhlerstand zu setzen.
Das UML-Klassendiagramm sieht folgendermaen aus
(- bedeutet private und + bedeutet public)
CCounter
- m_value: int
+ count()
+ getValue(): int
+ setValue(value: int)
berlegen Sie sich dabei Antworten zu folgenden Fragen:
1

1. Welche weitere Memberfunktion muss noch definiert werden?


2. Verwendet die Methode setValue(int value) das Konzept call by value oder
call by reference? call by Value
3. Wie hoch kann der Zhlerstand maximal sein, falls die Integer-Variable mit 32 bit
Wortbreite (4 Bytes) gespeichert wird?
2^32
4. Welche zwei Dateien (mit blicher Namensgebung in C++) entstehen bei dem
Entwurf einer Klasse und was sind die blichen Inhalte der beiden Dateien?
cpp. Datei & h.Datei
5. Warum ist es nicht ratsam, die private Membervariable ebenfalls ffentlich zu
deklarieren und wie heit das Konzept?
weil man sie nicht berschreiben soll und Membervariablen eigentlich grundstzlich
private sind

Schreiben Sie ein kleines Hauptprogramm in einer Datei main.cpp, das die Zhlerklasse
verwendet, damit Sie testen knnen, ob Sie Ihren Code korrekt geschrieben haben.

2. Aufgabe: Unit-Test der Klasse CCounter


In dieser Aufgabe soll die in der vorherigen Aufgabe erstellte Klasse CCounter in einer
vorgegebenen Testumgebung auf die richtige Funktionsweise getestet werden. Wir verwenden dafr das Google C++ Testing Framework. Die Tests haben wir schon geschrieben,
Sie mssen nur noch Ihre Klasse geeignet anpassen und dort einbinden. Das Google C++
Testing Framework ist in dem Testprojekt bereits enthalten.
Entpacken Sie dafr die Datei Blatt 2.zip und ffnen Sie das Projekt aus dem Ordner
Blatt 2 (Endung .vcxproj) mittels Datei ffnen Projekt/Projektmappe. Kopieren
Sie die beiden in der vorherigen Aufgabe erstellten Dateien (Header- und Quellfile) in
das Verzeichnis des Projekts (also zum main.cpp File) und machen Sie diese Dateien
dem Projekt bekannt. Im Projektmappen-Explorer (ggf.ffnen mit Strg+Alt+L in Visual C++ 2010) klicken Sie hierzu mit Rechtsklick auf Verzeichnis Quelldateien bzw.
Headerdateien und whlen Hinzufgen Vorhandenes Element. . . .
Bitte ndern Sie nicht das File main.cpp des Unit-Tests, dieses ist gewissermaen als
Spezifikation der Schnittstelle vorgegeben und darf daher - wie auch spter im Praktikum
- nicht gendert werden. Vielmehr sollten Sie im File main.cpp prfen, ob Ihre beiden
Files hierzu konsistent sind (z.B. hinsichtlich Existenz des verwendeten Konstruktors
und Namen der Klassen) und Ihre Klassen anpassen, soweit erforderlich.

Wenn Sie die Ausfhrung Ihres Programms starten (mit Klick auf den grnen Pfeil oder
F5), erhalten Sie einen berblick, welche Tests erfolgreich ausgefhrt werden konnten
und was noch nicht funktioniert. Passen Sie ihre Klasse so an, dass alle Tests einwandfrei
laufen.
Tipp: Wenn Sie nderungen vornehmen, die sich beim Durchlaufen des Programms
wider Erwarten nicht auswirken, whlen Sie Erstellen Projektmappe neu erstellen.
In der Express-Edition mssen Sie dafr erst Extras Einstellungen Erweiterte
Einstellungen whlen.

3. Aufgabe: Ableitung der Klasse CCounter


ndern Sie die Definition der Methode void count() aus der Klasse CCounter so ab,
dass diese nichts mehr tut. Machen Sie die Methode void count() und den Destruktor
darber hinaus virtuell, denn man sollte (als Vorsorge fr die Polymorphie) niemals in
C++ nicht-virtuelle Methoden berschreiben und der Destruktor sollte bei Verwendung
von virtual ebenfalls virtuell sein. Leiten Sie nun von der Klasse CCounter zwei Klassen
CForwardCounter und CVariableCounter ab und erzeugen zu diesem Zweck fr beide
neuen Klassen je eine Headerdatei und eine Quelldatei. Beachten Sie, dass Sie in den
beiden neuen Headerdateien die Basisklassen-Headerdatei mit #include laden mssen,
ebenso wie in den beiden neuen Quelldateien die zugehrigen Headerdateien zu laden
sind.
Beide Klassen implementieren (berschreiben) die Methode void count() auf zwei unterschiedliche Weisen:
In der Klasse CForwardCounter addiert die Methode wie vorher 1 auf den aktuellen
Wert.
In der Klasse CVariableCounter existiert zustzlich eine Membervariable m_step.
Diese Membervariable legt fest, um wie viel sich der Zhler bei jedem Aufruf von
void count() ndert. Sie wird im Konstruktor gesetzt und diesem als Parameter
bergeben.
Das neue Klassendiagramm sieht folgendermaen aus:
CCounter
m_value: int

+ getValue(): int
+ setValue(value: int)
+ count()

CForwardCounter

CVariableCounter
m_step: int

+ count()

+ CVariableCounter(step: int)
+ count()
Testen Sie auch hier mittels der Unit-Tests, ob sich Ihre Zhler richtig verhalten. ndern
Sie dazu zuerst in der Datei main.cpp die Zeile #define AUFGABE_2 in #define AUFGABE_3
um.
Frage:
1. Warum ist es sinnvoll, die beiden neuen Klassen von der Basisklasse CCounter
abzuleiten? bei den Klassen CForwardCounter & CVariableCounter handelt es sich um
Spezialisierungen der generalisierten Klassen CCounter. Sie beinhalten zum
Teil die gleichen Funktionen wie CCounter.