C++ von Klasse auf andere Klasse zugreifen?
-
Hallo,
ich habe folgendes vor.Es gibt eine KLasse Artikel und eine Klasse Liste(einfach verkettet).
Wenn ich nun einen neuen Artikel anlege, möchte ichl, dass die Klasse Artikel nachdem sie gepfrüft hat dass dieser Artikel nicht vorhanden ist eine Methode der Klasse Liste aufruft, um per "new" ein neues Listenelement der Klasse Liste zu erstellen.Also mein Aufruf sollte ausschauen(in der Klasse Artikel):
Liste.neuesListenelement(Artikel);Momentan ist mir das zwar über die Main möglich ein neues Listenelement zu erstellen, aber die oben beschriebene Lösung würde ich schon gerne anstreben.
Wahrscheinlich liegt die Lösung auf der Hand, nur momentan nicht auf meiner;-)
Für einen hilfreichen Gedanken schon mal vielen Dank im voraus.LG
[/cpp]
-
Hm,
ich würde da etwas drum herum bauen.
Der Artikel kann von der Liste eigentlich nix wissen weil es innerhalb dieser liegt. Es fühlt sich falsch an das , wenn man im Haus sitzt, es aussen anstreicht.Wie prüft denn Artikel ob es einen Artikel gibt ? Wenn diese dafür in Liste nachsehen muss, ist Liste schon bekannt. Dann verstehe ich das Problem nicht New der Liste aufzurufen.
Umschreib es mal detaillierter pls
-
Ich versuchs mal.
Zuerst: wenn ich in Artikel.cpp die Liste.h includiere, sollte ich doch mit den Methoden arbeiten können, oder??Also, mein Gedanke war, dass es schon einen Artikel gibt, der verschiedene variablen in der class Artikel besitzt.
Dieser wird beim Aufruf der Liste an ein Listenelement übergeben.
Dieses Listenelement ist natürlich vom Typ Artikel.Ein neues Objekt von Artikel, würde per Artikelnummer prüfen, ob es ein gleiches schon gibt, wenn ja, dann würde die Liste nach der Artikelnummer abgesucht und der Lagerbestand addiert.
Andernfalls wieder ein neues Listenelement erstellt und der neue Artikel angehängt.Wenn also eine Methode Artikel::pruefe(Artikel&)... feststellt dass es ein neuer Artikel ist, sollte er eine Methode der Klasse Liste, also Liste::neuerArtikel()..
aufrufen und einfach ein neues Listenelement erstellen....Oder müsste ich einen anderen Ansatz suchen?
thx
-
Ah ok, die Methode pruefe ist statisch. Ich dachte Du hast zu diesem Zeitpunkt schon ein Objekt angelegt.
Mir fällt hier keine elegante Lösung ein, weil Du irgendwo Liste definieren musst. So wäre es z.B eine Idee dem Artikel::pruefe die Liste zu überbeben in der geprüft werden soll. Wenn es nur eine einzige Liste gibt, und nur diese eine einzige geben darf, könnte man einen Singleton einsetzen um jederzeit an die Liste zu kommen. Aber das fühlt sich einfach nur ... naja, murks an
Aber was hälst Du denn davon, wenn Du Liste::pruefe(Artikel& art) schreibst und die Liste einen Artikel anlegen lässt ?
Die Liste kennt ja eh die Artikel und weíß intern bescheid. Sie weiß wie sie artikel haben will, wie sie diese verwaltet etc. Also lass die Liste prüfen und wenn es keinen Artikel gibt, leg innerhalb der Liste einen an.
SO könntest Du überall schreiben:
Artikel * art = Liste.pruefe("Artikelnummer");
Und hast immer einen gültigen Artikel da. (Und mach Dir mal gedanken warum die Methode statisch sein soll wenn Du ein Objekt übergeben willst zum prüfen ?!)
Kurz:
IMHO ist es sinvoller die Liste prüfen zu lassen und an dieser Stelle bei bedarf einen neuen Artikel zu erzeugen.
-
OKay, soweit verstanden... ich werde der Liste die Orga überlassen...
Werde das allerdings erst morgen mal versuchen...Allein zum Verständnis, ist es denn möglich Like: class Artikel{.... Liste.Methode()}..aufzurufen?
Ansonsten magst du mir deine Frage noch kurz erläutern...
**(Und mach Dir mal gedanken warum die Methode statisch sein soll wenn Du ein Objekt übergeben willst zum prüfen ?!) **
hätte meine aufrufe(..&) natürlich const gesetzt, falls du das gemeint haben solltest, sonst immer her mit Hinweisen:-)
Danke und LG
-
Naja, ich hab das so verstanden:
Artikel soll eine statische Methode prüfen haben. Also, es soll ohne Instanz möglich sein zu prüfen ob es ein Artikel gibt. Schlieslich soll ja ein neues Objekt erzeugt werden wenn kein Artikel da ist.
Aber warum muss ich dann ein Artikelojbekt an Artikel::pruefen übergeben ? Wenn ich ein fertiges Artikelobjekt übergebe aufdessen geprüft wird, hab ich dann nicht schon ein Objekt das ich einfach in die Liste pakcen kann ?
Man könnte ja auch den Spiess umdrehen und sagen: Artikel::pruefen(Liste & lst); und das Objekt sich in der Liste suchen lassen. (Aber der Ansatz wäre schräg ;O)
Welchen Weg Du am Ende gehst ist abhängig von dem drum herum. Mit den Informationen die Du gibst ist es nicht Sinvoll diese Funktionalität in Artikel zu lagern sondern das der "Liste" zu überlassen.
In wie weit das in der Liste sinvoll ist hängt von unbekannten Faktoren ab. Spiel mal ein wenig mit.
Ansonsten gibt es in der STL auch dinge, die es Dir erlauben einen Funktionspointer auf eine Methode eines Objektes zu liefern. Aber damit kenne ich mich nicht aus, müsste viel lesen und wäre ein unnötig komplexer und unpassender Ansatz
-
Ja ich denke DU hast auf jeden Fall recht.
WOhl kam der falsche Ansatz daher, dass die Aufgabe zuvor darin bestand nur die Klasse Artikel zu verwalten und dementsprechend Methoden zu implementieren.Werde das Morgen mal umformulieren und hoffentlich ohne exceptions compilieren;-)
Danke erstmal und ne gute Nacht
LG