Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche eine kleine Hilfe zu einer Aufgabenstellung
jancarsten
05-12-2005, 16:56
HI!
Wir haben eine Aufgabe bekommen bei der ich nicht so recht weiß, wie ich die angehen soll bzw. wie man die am besten löst. Hier die Aufgabe:
Container-Klassen können gleichzeitig Objekte unterschiedlicher Klassen speichern. Im
folgenden Beispiel enthält die Klasse Container intT- und stringT-Objekte.
Um unterschiedliche Datenobjekte in der Container-Klasse speichern und „gleichartig“
verarbeiten zu können, müssen es Datenobjekte von Klassen sein die von der Container-
Klasse abgeleitet sind.
Anforderungen an die Container-Klasse:
- es müssen unterschiedliche Datenobjekte speicherbar sein
- beliebig viele Objekte müssen speicherbar sein
- Objekte müssen am Anfang und am Ende und an beliebigen Stellen eingefügt und
entfernt werden können
- der Container muss durchlaufen werden können und zwar vorwärts und rückwärts
- es muss ein wahlfreier Zugriff auf Objekte mit Hilfe des [] – Operators möglich sein
- der Container muss ausgegeben werden können
Aufgabe:
Erstellen Sie eine Container-Klasse die den o. a. Anforderungen genügt. Zeigen Sie anhand
einer entsprechenden Testumgebung die Korrektheit der Klasse auf. Es genügt wenn Sie die
Klassen stringT und intT ableiten.
Kann mir mal jemand auf die Sprünge helfen. Ich versteh irgendwie net was der Prof. eigentlich von mir/uns will. Bin schon ein par Minuten am grübeln :eek:
Vieleich kann mir ja jemand auf die Sprünge helfen. Hilfe in Form von Pseudocode wäre nicht schlecht!
EDIT:
Hab ich das richtig verstanden, dass ich in der Klasse "Container" eine Liste brauche? Kann man da die STL Liste nehmen?
mfg janosch
peschmae
05-12-2005, 18:05
Ich verstehe die Aufgabenstellung auch nicht ganz. Ich meine die Containerklasse soll
- beliebig viele Elemente aufnehmen können ("beliebig viele Objekte müssen speicherbar sein")
- die Elemente sind von der Containerklasse abgeleitet ("Um unterschiedliche Datenobjekte in der Container-Klasse speichern und „gleichartig“ verarbeiten zu können, müssen es Datenobjekte von Klassen sein die von der Container-
Klasse abgeleitet sind.")
Also sind die Elemente wiederum Container? Also machst du eigentlich einen Baum?
Sorry, kann dir da auch nicht wirklich helfen.
MfG Peschmä
jancarsten
05-12-2005, 18:39
Hmm wenn ich es so mache, dass ich in der container-klasse die methoden erstelle um so einen Baum aufzubauen ist es doch erstmal unwichtig was für ein Datentyp das ist. Aber wie benutze ich dann die STL::Liste in der Klasse "Container"? Ich denke mal wir sollen dann von der Klasse "Container" die zwei Klassen intT bzw. StringT ableiten(vererbung haben wir grad dran genommen).Somit haben wir ja von der Klasse "Container" die Methoden zum aufbau eines Baum's vererbt bekommen. Oder ist es besser, wenn ich in den Klassen intT bzw. StringT eine Liste anlege z.B. so "Liste<Container> foobar" aber dann ist ja die vererbung unützt oder nicht?
mmm
also wenn ich das richtig verstanden habe, dann sollst du eine container-klasse selbst erstellen ...
und davon dann eine klasse StringT und IntT ableiten ...
also nicht die bereits bestehende klasse verwenden, sondern selbst programmieren ...
aber tröste dich wir haben auch so bescheuerte aufgabenstellungen, die man immer mehrmals lesen muss ...
gruesse
Container-Klassen können gleichzeitig Objekte unterschiedlicher Klassen speichern. Um unterschiedliche Datenobjekte in der Container-Klasse speichern und „gleichartig“ verarbeiten zu können, müssen es Datenobjekte von Klassen sein die von der Container-
Klasse abgeleitet sind.
Ich weiss nicht, auf welchen Niveau Du informatik hasst, aber bei dem Satz kraeuseln sich mir die Fussnaegel.
Ich vermut mal, das dein "Aufgabengeber" hier entweder arge Probleme hat, logische Sachverhalte verbal einigermassen verstaendlich zu formulieren, oder gar von Begriffen der DV null Ahnung hat.
Deine Moeglichkeiten:
- Sag deinem Lehrer, das er erstmal selber vernuenftig Aufgaben formulieren lernen soll. Und gib Ihm den Link auf die Seite hier, das wir ihn zerpfluecken koennen ^^
- Mit viel Humor versuche die Aufgabenstellung zu interpretieren und riskiere , das du alles falsch verstehst ^^ wie alle anderen auch :-)
Der erste grobe logische Mangel iss, das die Datenobjekte vom container abgeleitet werden muessen. Das ist purer Bloedsinn ^^ Sie muessen ne gemeinsame Basis haben ! Dann geht es auch mit unterschiedlichen klassen.
Naechste sache ist ... er spricht von Containern. Das ist viel zu ungenau. Sind es container im Sinne der DV dann muessen die Container die "Besitzer" der Objecte sein, also reine Zeiger-Sammlungen fallen raus.
Damit hasst du ein Problem, du kennst nur die Basis deiner Objecte (laut Aufgabenstellung) und musst trotzdem Kopien erstellen koennen.
Das geht nur mit dem Trick ueber ne clone funktion.
Dazu iss aber nirgends festgelegt, wie Du Deine IntT und StringT anpassen darfst ....
Nen Ansatz waere :
class Container // der Container Selber
{
class ContainerElementBase // gleich mal die basis aller Objecte definieren
{
protected:
ContainerElementBase(){} // nur per ableitung Instanzieirbar
public:
~ContainerElementBase(){} // aber jeder soll loeschen koennen (delete)
virtual ContainerElementBase * clone() const = 0; // Clonefunktion erzwingen, ohne die kannst keine kopien unbekannter Objecte erstellen
};
// Einfuegen in den "Container"
void instert(const ContainerElementBase & rxElem)
{
// mit ner liste(vector) auf Zeiger von ContainerElementBase sollte das kein problem sein ...
// den zeiger bekommst von der clone funktion.
}
// usw usf ....
// konstruktor / destruktor remove und was man so nich alles braucht
// wichtig, beim destruktor, das du besitzer bist, alle elemente loeschen ...
};
Zum arbeiten muss dein StringT und IntT dann von Container::ContainerElementBase abgeleitet sein, und die Typen muessen die clone funktion implementieren ....
Der [] operator in kombination mit dem insert per Referenz wird dir arge Probleme machen, weil der erwartungsgemeass ne referenz auf dein Object zurueckgeben sollte. Falls dein object mal nicht clonebar sein sollt, musst entweder sofort ne exception werfen / darfst das element nich einfuegen, oder beim derefernzieren ueber den [] operator faellst auf die nase.
Da du den zugriff ueber Index brauchst, muessen deine objecte intern umkopierbar sein (kein problem bei zeigern) und es bietet sich statt der liste gleich der vector aus der STL an ...
Designtechnisch iss das ganze mehr als zweifelhaft :-(
Normale Libs kennen nur Container mit einem bestimmten Typ von objecten (bsp. std::list und co) , oder Listen von Zeigern (beispiel QT Object Hirarchie), was im DV technischen sinne keine wirklichen container fuer den Typ Object sind sondern nur fuer Object *. (wenn du deine Objecte ausserhalb erzeugst, und nur die Zeiger in die container pumpst, solltest du die Objecte auch ausserhalb loeschen ! die QT geht da aehm "eigene" wege )
Die korrekteste loesung in C++ waern Wrapper fuer deine StringT und IntT typen zu schreiben, und den container nur fuer die wrapper zu bauen ....
Ciao ...
wiso nich einfach n struct in dem du die datentypen definierst, dann n array vom typ struct machst die dan sozusagen als container dienen?
wiso nich einfach n struct in dem du die datentypen definierst, dann n array vom typ struct machst die dan sozusagen als container dienen?
Naja, weil in der Aufgabenstellung was von "Container, der Objecte unterschiedlicher Klassen speichert" und "abgeleitet von "steht.
Ausserdem sollt man das nachbauen von "Variant" (ob nu mit void * oder mit unions) meiden, weil sie einen Vorteil von C++, der strengen Typpruefung, zugegebenermassen teilweisse elegant :-) , umgehen.
Ciao ...
ok.
ich denk zu sehr in ansi c... =)
Naja so falsch iss die Idee in der Praxis ja ansich nich (der wrapper wuerde ja die sache auf nen aehnlichen nenner bringen) nur die doofe Aufgabenstellung verhindert es ^^
Ciao ...
jancarsten
06-12-2005, 16:28
Moin!
hehe da bin ich ja beruhigt, dass ich nicht der einzigste bin, der die Aufgabe nicht wirklich versteht. Das tut eigentlich keiner mit dem ich bis jetzt schon gesprochen habe ^^
Naja er wird aber in der Vorlesung nochmal was dazu sagen ^^
na ja, ich habe bei unseren aufgabenstellungen gelegentlich den verdacht alles auf einmal in "2" zeilen erschlagen zu wollen.
und so sieht eure aufgabe auch aus ....
zeige mal, dass du eigentlich nix verstanden hast, aber damit umgehen kannst ....
na ja, ich habe noch 2 rückfragen offen .... bin mal gespannt ob ich noch antworten bekomme ...
eigentlich müsste ich in beiden fällen recht haben ... antwort möchte ich trotzdem ;-)
gruesse
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.