PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Ober- und Unterklassenprobleme


BodyLove
2007-07-10, 21:53:00
Hi,

ich habe eine Oberklasse "Verzehr" und 2 Unterklassen Pommes und Bier. Bei Pommes und Bier gibt es jeweils 1 Fkt, die Pommes und Bier als string zurückgeben.

Diese 2 Fkt soll ich im Kontruktor von Verzehr aufrufen. Hier liegt auch das Problem. Verzehr kennt die beiden Klassen Pommes und Bier nicht. Man soll in solch einem Fall die fkt virtual void pommeskaufen() setzen.


Klappt aber nicht. Wo mache ich einen fehler?

DaEmpty
2007-07-10, 22:13:15
Wo mache ich einen fehler?
Im Klassendesign?
Warum sind Pommes und Bier nicht Unterklassen von Lebensmitteln, die eine virtual Function "verzehren" hat?

BodyLove
2007-07-10, 22:23:55
okay,

du meinst ich solle eine Oberklasse Lebensmittel mit den 2 Unterklassen verbinden und dabei noch Lebensmittel mit Verzehr. Alles okay.

virtual verzehren bräuchte ich zur Zeit ja nicht. Verstehe aber auch nicht genau, was du mir damit sagen willst. Ich will ja Bestellungen aufnehmen. Hierbei nutze ich eine VerketteListe als Queue, auch eine Vorgabe. Das funktioniert auch alles wie gesagt einwandfrei, solange ich die main als ort der Steuerungsbefehle nutze.

Ich versuche mal mit deinem Vorschlag. Danke.:)

€:

Also, in der Fragestellung steht geschrieben, dass Pommes und Bier zwingend Unterklassen von Verzehr sein müssen. Die Klassendefinition darf nicht verändert werden.

DaEmpty
2007-07-10, 22:33:08
du meinst ich solle eine Oberklasse Lebensmittel mit den 2 Unterklassen verbinden und dabei noch Lebensmittel mit Verzehr. Alles okay.
Ich bin grad verwirrt.
Was hat der Vorgang "Verzehr" mit den Objekten vom Typ "Lebenmittel"/"verzehrbare Gegenstände" zu tun?

Wenn du Bestellungen aufnehmen willst hast du höchstens eine Liste von Objekten vom Typ Bestellungen. Dann hättest du noch ein Klasse "Verkäufer"/"Kellner" und eine Klasse "Konsument"/"Käufer"/"verfressenes Ding". Objekte vom Typ Kellner arbeiten die Liste von Bestellungen ab und geben Objekte vom Typ Lebenmitteln an Objekte vom Typ Käufer. Diese sammeln ihre Lebensmitteln und können sie dann verzehren.

edit:
Also, in der Fragestellung steht geschrieben, dass Pommes und Bier zwingend Unterklassen von Verzehr sein müssen. Die Klassendefinition darf nicht verändert werden.
Schöne scheiße.
Aus ner unlogischen Aufgabenstellung lassen sich nur unlogische Lösungen bauen...

BodyLove
2007-07-10, 22:36:33
Das was ich programmiere ist keine Freie Aufgabe, sondern eine feste Vorgabe. Ich programmiere eine Klausuraufgabe. Das es keinen Sinn macht, verzehr mit den beiden Unterklassen zu verbinden ist klar. Nur so ist nun mal die Vorgabe.

Nach dem Konzert von DAD in der Batschkapp kam es zu einem großen Andrang an der Imbißbude, die Pommes (mit Ketschup und Majo - versteht sich) und Bier verkauft. Der Betreiber erklärt der langen Schlange von genußgierigen Personen, daß das Fett noch nicht heiß ist und zuerst Kunden, die Bier haben wollen, bedient werden.
Ausbaustufen:
1. Implementation einer Klasse Verzehr mit der virtuellen Methode verzehren und mit den Unterklassen Pommes und Bier. Im übrigen wird Bier getrunken und Pommes gegessen. Implementation einer Klasse Warteschlange als einfach verkettete Liste über Objekten der Klasse Verzehr mit den Operationen bestellen (ans Ende der Schlange hinzukommen) und bedienen (die Schlange verlassen).
Die Steuerung der Imbißbude soll im Konstruktor dieser Klasse geschehen. Die Warteschlange gehört selbstverständlich zu der Imbißbude. In dieser ersten Version soll eine Reihe von Personen bestellen und bedient (Methode bedienen!) werden. (Die Pommes werden im lauwarmen Fett fritiert - igitt!).


Nach meinem Verständnis sollen alle Eingabebefehle über den Konstruktor von Verzehr durchlaufen. Über die Klasse Liste sollen fkt bestellen und bedienen geben.

Matrix316
2007-07-10, 22:52:45
Also ich versteh das so, dass die "Steuerung der Imbissbude" im Konstruktor der Klasse "Warteschlange" passieren soll (und nicht in Verzehr).

DaEmpty
2007-07-10, 23:00:19
Nach meinem Verständnis sollen alle Eingabebefehle über den Konstruktor von Verzehr durchlaufen. Über die Klasse Liste sollen fkt bestellen und bedienen geben.
Die Steuerung der Imbißbude soll im Konstruktor dieser Klasse geschehen. Die Warteschlange gehört selbstverständlich zu der Imbißbude. In dieser ersten Version soll eine Reihe von Personen bestellen und bedient (Methode bedienen!) werden. In dieser ersten Version soll eine Reihe von Personen bestellen und bedient (Methode bedienen!) werden
Für mich heißt das, dass es noch eine Klasse Imbißbude gibt, die eine Funktion "bestellen" und "bedienen" hat. In deren Konstruktur soll die Steuerung stattfinden. Eigentlich bräuchte man noch eine Klasse Person, denn wer soll das verzehren aufrufen? Oder macht das die Funktion bedient? :uhammer:
Außerdem Steuerung der Imbißbude? WTF?
Für mich heisst das einfach das Szenario steuern.
Da würd ich einfach 2 mal bestellen aufrufen, danach "bearbeiteWarteschlange" welches der Reihe nach "bedient(uint kundenID,Verzehr essen)" aufruft, welches wiederum direkt "essen.verzehren" aufruft.

Diese Aufgabenstellungen ist für wirklich fürn ... "Popo" und klingt danach, dass einer keine Lust und selber Probleme mit Klassenmodellierung hatte.

BodyLove
2007-07-10, 23:00:29
Uff. Das macht die Sache (für mich) noch komplizierter. Man, muss ich Germanistik studieren, damit ich diese Aufgaben verstehe.:rolleyes:

Ich schlafe mal drüber nach. Vielleicht kommt mir die Erleuchtung.:biggrin:

Ich probiere mal das über die Liste durchzuführen. Aber erst morgen. Vielen dank.

Diese Aufgabenstellungen ist für wirklich fürn ... "Popo" und klingt danach, dass einer keine Lust und selber Probleme mit Klassenmodellierung hatte.

Das Komische ist ja, dass der Herr mit am Besten Objektorientiertes Programmieren lehren kann. Ehrlich gesagt frage ich mich selbst, was er sich dabei gedacht hat. In UML-Modellierung und via eERM wissen wir ja, wie wir eigentlich modellieren sollen.

Naja. Also an eine Klasse Imbissbude habe ich nicht gedacht. Was soll denn der bringen? Welchen nutzen hätte es für mich in diesem Programm?

DaEmpty
2007-07-10, 23:14:26
Naja. Also an eine Klasse Imbissbude habe ich nicht gedacht. Was soll denn der bringen? Welchen nutzen hätte es für mich in diesem Programm?
Normalerweise baut man ja selber keien Queue und nutzt einfach eine vorhandene Implementierung. Hier soll man wohl sehen, dass man eine Queue einfach als Liste implementieren kann, die man in einer anderen Klasse nutzt.
Die Imbißbude würde damit wohl nur die Funktionen wrappen und wäre damit überflüssig, wenn man es selber implementiert und nicht wiederverwendet...

Einerseits steht da nichts konkret von einer Klasse für die Imbißbude, aber andererseits ist ohne eine Klasse Imbißbude die Formulierung "Die Warteschlange gehört selbstverständlich zu der Imbißbude" sehr seltsam.

Die Aufgabe scheitert an ihrer schlechten Formulierung und würde wohl in einer Klausur auch besser erklärt werden, wenn man nachfragt.

Expandable
2007-07-11, 10:21:06
Aber das ursprüngliche Problem lässt sich doch ganz einfach lösen, wenn ich das richtig sehe:

class Verzehr
{
public:
virtual void verzehren() = 0;
Verzehr()
{
verzehren();
}
}

class Pommes : public Verzehr // analog Bier
{
public:
void verzehren();
Pommes() : Verzehr() {};
}

Falsch, bitte vergessen!

SGT.Hawk
2007-07-11, 14:36:15
Ich glaube, es ist ein Fehler eine dynamische Methode im Konstruktor aufzurufen....

Expandable
2007-07-11, 16:11:57
Ich glaube, es ist ein Fehler eine dynamische Methode im Konstruktor aufzurufen....

Stimmt.

Ectoplasma
2007-07-13, 17:51:49
Ich glaube, es ist ein Fehler eine dynamische Methode im Konstruktor aufzurufen....

Das brauchst du nicht zu glauben, dass ist ganz bestimmt ein Fehler ;)

Polymorphie funktioniert in C++ erst dann, wenn die Konstruktoren ALLER! abgeleiteten Klassen durchlaufen wurden. Erst in diesem Moment ist die V-Table korrekt initialisiert.