Streichelzoo

Neue Frage »

Auf diesen Beitrag antworten »
kleinerstrolch Streichelzoo

Haufig wird Vererbung dazu eingesetzt, eine “ist ein”-Beziehung zwischen verschiedenen Klassen ¨
darzustellen. Funktionen, die mit vielen verschiedenen Klassen funktionieren sollen, werden fur eine ¨
abstrakte Basisklasse (Schnittstelle) definiert und anschließend mit Objekten benutzt, deren Klassen
von dieser Basisklasse abgeleitet wurden.
Ziel dieser Aufgabe ist die Darstellung der Vorteile dieser Trennung in Schnittstelle und Implementierung
an einem konkreten Beispiel. Stellen Sie sich einen Zoo vor, in dem es eine Vielzahl
verschiedener Tiere gibt. Fur jedes Tier soll vereinfachend gelten, dass es sich um ein S ¨ augetier, einen ¨
Vogel oder einen Fisch handelt. Desweiteren
• ist es den Besuchern moglich, einen Teil der Tiere zu f ¨ uttern (z.B. Ziegen, G ¨ anse, Goldfische), ¨
andere nicht (Pinguine, Baren, Haie). ¨
• ist es den Besuchern moglich, einen Teil der S ¨ augetiere zu streicheln (Ziegen), andere nicht ¨
(Baren). V ¨ ogel und Fische k ¨ onnen nicht gestreichelt werden. ¨
• machen Saugetiere und V ¨ ogel charakteristische Ger ¨ ausche. Wir nehmen an, dass Fische stets ¨
stumm sind.
• haben alle Tiere (ja, auch die Goldfische!) einen Spitznamen, der ihnen im Konstruktor uberge- ¨
ben wird.
Implementieren Sie eine Klassenhierarchie, so dass es moglich ist, die Funktionen ¨
• void fuettern ( Tier& tier )
• void streicheln ( Saeugetier& saeugetier )
• void geraeusch ( Saeugetier& saeugetier )
• void geraeusch ( Vogel& vogel )zu nutzen. Legen Sie außerdem mindestens zehn verschiedene Tierarten an, davon mindestens
zwei aus jeder der drei Kategorien. Ein Aufruf der oben genannten Funktionen soll das Tier fragen,
ob die gewunschte Operation m ¨ oglich ist, und dann Ausgaben z.B. der folgenden Form erzeugen: ¨
Die Ziege Billy l¨asst sich f¨uttern.
Der B¨ar Bruno m¨ochte nicht gestreichelt werden!
Die Gans Herta schnattert.
Da die Eigenschaften der Tiere fur eine ganze Art gelten und somit von der Instanz unabh ¨ angig ¨
sind (alle Ziegen lassen sich futtern, nicht nur Billy), k ¨ onnen Sie sie mit dem Schl ¨ usselwort “ ¨ static”
als Klassenvariable deklarieren:
static const bool fuetterbar = <Wert>;
Dadurch wird die Variable nicht fur jede Instanz erneut angelegt, außerdem wird deutlich, dass ¨
es sich um eine Eigenschaft handelt, die alle Tiere dieser Art teilen.
Benutzen Sie fur diese Aufgabe abstrakte Basisklassen und rein virtuelle Methoden. Sorgen Sie ¨
dafur, dass die einzelnen Tierarten genau jene Variablen und Methoden erhalten, die sie zum Funk- ¨
tionieren benotigen, z.B. sollte es kein ¨ bool streichelbar fur Fische geben. Geben Sie zus ¨ atzlich ¨
zu Ihrem Programm ein Diagramm ab, in dem Sie die durch die Vererbung gegebene Baumstruktur
darstellen.

^^ das ist die aufgabe die ich erledigen soll

dazu habe ich bisher folgendes:

als eine streichelzoo.h habe ich:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
#include <iostream>
#include <cstring>

using namespace std;

// CTier Abstrakte Klasse

class CTier {

	public:
		CTier() { strcpy(m_name, ""); }
		virtual ~CTier()  { }
		void setName(char *name)  { strcpy(m_name, name);		}
		virtual void vorstellen() { cout << "Hallo, mein Name ist " <<m_name <<endl; }
		virtual CTier* create(char *) = 0; // rein Virtuelle Methode
		
	private:
		char m_name[50];
		};
		
// CSäugetier

class CSaeugetier : public CTier {
	public:
		CSaeugetier() { }
		virtual ~CSaeugetier() { }
		virtual void vorstellen() {
			CTier::vorstellen();
			cout <<"Ich bin ein Säugetier"<<endl;
			
		}
};

// CFisch

class CFisch : public CTier {
	public:
		CFisch() { }
		virtual ~CFisch() { }
		virtual void vorstellen() {
			CTier::vorstellen();
			cout << "Ich bin ein Fisch" <<endl;
			
		}
};

// CVogel

class CVogel : public CTier {
	public:
		CVogel(){ }
		virtual ~CVogel() { }
		virtual void vorstellen() {
			CTier::vorstellen();
			cout << "Ich bin ein Vogel" <<endl;
			
		}
};

// Tierart  - legt eine Klasse an, welche von Vogel, Fisch oder Säugetier abgeleitet ist. Der Konstruktor legt die individuellen Namen fest.

#define TIERART(cname,oberklasse,whoami)
	class name : public oberklasse
	{
		public:
			cname(char *name) { CTier::setName(name); }
			/* Default-Konstruktor für Kreirrepresäntant */
			cname() { }
			void vorstellen() {
				oberklasse::vorstellen();
				cout << "Ich bin " << whoami <<endl;
			
			}
		/* Kreirfunktion: Forward Ownership! */
		CTier* create(char *name) { return new cname(name); }

	};
#endif






und als streichelzoo.cpp

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
#include <stdlib.h>
#include <time.h>
#include "streichelzoo.h"

// Namensvergabe
char *namen[] = { "Mehmet", "Aykut", "Dumbo", "Helga", "Henni",
"KQLY", "SMN", "SF", "Emilio", "Blume" };
const int namZahl = sizeof(namen) / sizeof(*namen);

// Tierarten (Klassen anlegen)
SPEZIES(CZiege, CSaeugetier, "eine Ziege")
SPEZIES(CPinguin, CVogel, "ein Pinguin")
SPEZIES(CGoldfisch, CFisch, "ein Goldfisch")
SPEZIES(CBaer, CSaeugetier, "ein Bär")
SPEZIES(CGans, CVogel, "eine Gans")
SPEZIES(CHai, CFisch, "ein Hai")
SPEZIES(CDachs, CSaeugetier, "ein Dachs")
SPEZIES(CLachs, CFisch, "ein Lachs")
SPEZIES(CAmsel, CVogel, "eine Amsel")
SPEZIES(CElefant, CSaeugetier, "ein Elefant")

// main methode

int main(void) {


wie gehe ich jetz vor um dort mit void etc die tiere jeweils korrekt ausgeben zu lassen das sie eben beispielsweise gefüttert werden wollen aber nicht gestreichelt und dann auch noch die art des geräuschs das sie immer von sich geben - und dabei noch an die aufgabevorgaben da halten
 
Auf diesen Beitrag antworten »
eulerscheZahl

Ehrliche Antwort: das ist ziemlich viel, ich habe keine Lust, das komplett durchzugehen.

Der Sinn der Trennung in .h und .cpp ist, im Header nur zu sagen, welche Methoden es gibt. Die Implementierung erfolgt komplett in der zugehörigen .cpp. Das Testen der Funktionen kommt in eine weitere Datei, nennen wir sie main.cpp.

#endif macht nur dann Sinn, wenn das if auch irgendwo losgeht, z.B. durch #ifndef
Auf diesen Beitrag antworten »
kleinerstrolch

das endif habe ich nun weggelassen

soweit schon danke unglücklich
 
Neue Frage »
Antworten »


Verwandte Themen