Suchfunktion in einer Klasse mit mehreren Instanzen
-
@DocShoe sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Vielleicht doch lieber einen Accountnamen und den durchnummerieren?
Dann könnte man vlt das Blockieren automatisieren
-
Dann benutzen wir mal Occam's Razor. Es gibt hier zwei Möglichkeiten:
- Man selbst leidet an einer Persönlichkeitsstörung.
- Alle anderen Forenteilnehmer leiden an einer Persönlichkeitsstörung
Wenn alle hier an einer Dissozialen Persönlichkeitsstörung leiden sollen, wie erklärst du, dass es fast ausschließlich dich betrifft? Normalerweise sollten doch dann alle alle anderen negativ bewerten, aber das ist nicht der Fall.
Du redest dir nach Pippi-Langstrumpf-Art die Welt so zu recht, wie du sie gerne hättest, deine Unfähigkeit zur Reflexion ist einfach unfassbar. Ich bin kein Psychologe, aber ich kann mir gut vorstellen, dass das schon krankhaft ist. Vielleicht solltest du dir mal 'nen Psychologen suchen, du musst doch außerhalb des Forums die Auswirkungen mitbekommen.
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Ist ja auch der einfachere Weg, als das eigene Verhalten mal zu überdenken.
Ich probiere es nochmal, auch damit @Lumberjack die Argumente versteht.
Keiner der Kritikpunkte, bis auf 3., ist gerechtfertigt.
Ich habe mal ein paar Fragen:
- Du hast deine verkettete Liste über zwei Klassen implementiert und hierbei die Daten in ein Listenelement eingefügt. Was machst du aber, wenn du z.B. Personendaten speichern möchtest? Und was macht wohl ein Anfänger daraus? Copy Paste Antipattern?
- Warum macht die STL dies anders (z.B.
std::find_if
)? - Warum zum Teufel nutzt du überhaupt
new
und nichtstd::unique_ptr<>
oder besserstd::vector<>
? Du hast ein Speicherloch im Code. Der folgende Code frisst 1,3 GByte RAM!
#include <iostream> #include <string> #include <stdexcept> #include <map> using namespace std; class Element { private: int topspeed; int horsepower; double kg; Element* next = nullptr; public: Element(int kmh, int hp, double kg) : topspeed(kmh), horsepower(hp), kg(kg) {}; // ~Element(); int getTopspeed(); int getHorsepower(); double getKg(); Element* getNext(); void setNext(Element* e); }; int Element::getTopspeed() { return topspeed; } int Element::getHorsepower() { return horsepower; } double Element::getKg() { return kg; } Element* Element::getNext() { return next; } void Element::setNext(Element* e) { next = e; if (e != nullptr) { next->next = nullptr; // to go sure } } class Liste { private: Element* first = nullptr; public: // Liste(); // ~Liste(); void addElement(Element* e); void printAll(); void filterPrint(string nameOfAttribute, double min, double max); }; void Liste::addElement(Element* e) { if (e == nullptr) { throw invalid_argument("nullptr nicht erlaubt hier"); } if (first == nullptr) { first = e; e->setNext(nullptr); // to go sure return; } Element* temp = first; while (temp->getNext() != nullptr) { temp = temp->getNext(); } temp->setNext(e); } void Liste::printAll() { Element* temp = first; for (size_t i = 1;; i++) { cout << temp << endl; if (temp == nullptr) { cout << i - 1 << endl << endl; break; } temp = temp->getNext(); } } void Liste::filterPrint(string nameOfAttribute, double min, double max) { map<string, int (Element::*)()> mapi; map<string, double (Element::*)()> mapf; mapi["topspeed"] = &Element::getTopspeed; mapi["horsepower"] = &Element::getHorsepower; mapf["kg"] = &Element::getKg; Element* temp = first; for (size_t i = 1;;) { if (temp == nullptr) { cout << i - 1 << endl << endl; break; } if ((temp->*mapi[nameOfAttribute])() >= min && (temp->*mapi[nameOfAttribute])() <= max) { cout << temp << endl; i++; } temp = temp->getNext(); } } int main(int argc, char const* argv[]) { // ACHTUNG! Der folgende Code hat ein Speicherloch und wird größere Mengen an RAM // verschlingen. Instabilitäten mit Windows sind nicht ausgeschlossen. Eine // Speicherung aller relavanten Daten in Windows wird daher empfohlen. const size_t Count = 2000; // Achtung! Frisst auf meiner Testmaschine 1,3 GByte RAM! // Bitte hier Process Explorer (oder vergleichbares Tool) starten und Prozess beobachten for (size_t i = 0; i < Count; i++) { for (size_t j = 0; j < Count; j++) { Element* e1 = new Element(200, 100, 1500); Element* e2 = new Element(299, 350, 1900); Element* e3 = new Element(325, 500, 1800); Element* e4 = new Element(312, 390, 1555); Liste* l = new Liste(); //l->printAll(); l->addElement(e1); l->addElement(e2); l->addElement(e3); l->addElement(e4); //l->printAll(); /*l->filterPrint("topspeed", 250, 313); l->filterPrint("horsepower", 401, 999);*/ } } return 0; // Hier Breakpoint setzen }
- Warum mappst du Klassenattribute auf Strings? Das kostete dich unnötige Zeit (2O(nlog(n)) + O(log(n)), macht die Sache unintuitiv und sieht buggy aus. Oder warum funktioniert ein
l->filterPrint("kg", 250, 313);
nicht? - Warum nutzt du keine const Correctness?
- Klassen sollten einfach zu benutzen und schwer zu missbrauchen sein. Warum findet der folgende Code nichts?
/// siehe obigen Code int main(int argc, char const* argv[]) { // ACHTUNG! Der folgende Code hat ein Speicherloch und wird größere Mengen an RAM // verschlingen. Instabilitäten mit Windows sind nicht ausgeschlossen. Eine // Speicherung aller relavanten Daten in Windows wird daher empfohlen. Element* e1 = new Element(200, 100, 1500); Element* e2 = new Element(299, 350, 1900); Element* e3 = new Element(325, 500, 1800); Element* e4 = new Element(312, 390, 1555); Liste* l = new Liste(); l->printAll(); l->addElement(e1); l->addElement(e2); l->addElement(e3); l->addElement(e4); l->printAll(); e1->setNext(nullptr); //l->filterPrint("kg", 250, 313); l->filterPrint("topspeed", 250, 313); l->filterPrint("horsepower", 401, 999); return 0; // Hier Breakpoint setzen }
- Und jetzt die alles entscheidende Frage: Findest du solche Fehler in meinem Code?
C++20 hat aus seinen Fehlern gelernt, warum sollten Anfänger die Fehler lernen?
-
@DocShoe einfach nur erbärmlich, mehr kann man dazu nicht sagen.
Btw. Dissoziale Persönlichkeitsstörungen werden medikamentös behandelt. Falls du dich gerade in psychologischer Behandlung befindest, solltest du das in den Wind schlagen.
... Und es gibt einen Grund, weshalb ich von negativen Bewertungen Abstand nehme. Denk mal nach.
-
@Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Warum findet der folgende Code nichts?
Weil du die Datenstruktur mutwillig durch np-Zuweisung zerstörst.
@Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Du hast deine verkettete Liste über zwei Klassen implementiert und hierbei die Daten in ein Listenelement eingefügt. Was machst du aber, wenn du z.B. Personendaten speichern möchtest?
Danach wurde nicht gefragt, oder? Es ging um Autos.
@Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Warum macht die STL dies anders (z.B. std::find_if)?
Weil danach auch nicht gefragt wurde. Ebenso wenig nach
vector
. Es wurde nach einer eigenen Implementierung gefragt.@Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Warum zum Teufel nutzt du überhaupt new und nicht std::unique_ptr<> oder besser std::vector<>?
Ich hatte doch schon gesagt, dass ich in dem Punkt der Kritik (dem "Review") zustimme.
Also, noch mal, ich orientiere mich für gewöhnlich an den Anforderungen der Aufgabenstellung.
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
@Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Warum macht die STL dies anders (z.B. std::find_if)?
Weil danach auch nicht gefragt wurde. Ebenso wenig nach
vector
. Es wurde nach einer eigenen Implementierung gefragt.Nein, es wurde nicht nach einer eigenen Implemtierung gefragt. Es wurde nach einer Möglichkeit gefragt, neue KFZ anzulegen. Dass man eine eigene einfach verkettete Liste implementieren soll entspringt deinem Wunschdenken.
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Weil du die Datenstruktur mutwillig durch np-Zuweisung zerstörst.
Also ist jetzt der Benutzer schuld am Fehler?
Danach wurde nicht gefragt, oder? Es ging um Autos.
Und genau das ist dein Problem. Schon wieder windest du dich aus der Situation heraus. Würdest du mal mit deinem "die ganze Welt ist gegen mich" Gejammere aufhören und endlich mal auf deinen Hosenboden setzen und nachforschen, so würdest du das Problem erkennen.
Gerade Anfänger gehen da gerne hin, kopieren den Code und passen den Code entsprechend den Persionendaten. Und so entstehen im Laufe der Zeit X Klassen und X Listenimplementierungen. Und dann kommt jemand, entdeckt in einer Klasse einen Fehler in der Listenimplementierung und peng müssen X Klassen gefixt werden. So geschehen bei mir mit einer CRC Implementierung.
Das ist das Problem des Copy Paste Antipattern.
-
Der ganze Kram hat noch ein ganz anderes Problem: Der
std::map::operator[]
erzeugt für Schlüssel, die nicht in der map vorhanden sind, einen Default value. Bei Zeigern jeder Art ist dasnullptr
, wenn der Benutzer im CodefilterPrint( "TopSpeed", 100, 200 );
aufruft gibt deroperator[]
einennullptr
zurück, der dann derefenziert wird. Booom! Die Namen der Attribute sind in der Implementationsdatei versteckt, also muss man da erst mal nachgucken, wie die genaue Bezeichnung ist.Langfristige Betrachtung weit jenseits der Aufgabenstellung:
Wenn sowas irgendwo in einem größeren Projekt landet, oder noch fieser in einer Bibliothek, zu der man nur die Header Dateien hat, wird man Probleme haben, diese Bezeichner zu finden. Das ist für diese Aufgabe nicht relevant, ist aber prinzpiell problematisch, weil keine Plausibilitätsprüfung stattfindet. Wenn man unbedingt diesen Weg gehen möchte, dann ist die Identifikation des Attributs über einenum class
deutlich robuster. Trotzdem bleibt es unflexibel, weil man keine beliebige Filter festlegen kann, sondern nur nach einem Kriterium filtern kann. Also Filter wie Höchgeschwindigkeit >200km bei max. 120PS gehen nicht, da ist die gezeigt STL-Lösung nicht eingeschränkt.Edit:
@Fragender / @cyborg_betaMan kann jetzt argumentieren, dass es allein um die Lösung der Aufgabe geht. Für den Unterricht/Kurs/Vorlesung mag das ja stimmen, aber eigentlich sollen diese Aufgaben dazu dienen, die entsprechende Methodik zu entwickeln. Diese Übungsufgaben werden gestellt, um zu üben, damit man später für Real-World Anwendungen den passenden Ansatz hat. Und wenn schon bei der kleinen Aufgabe gezeigt wird, wie man sich das irgendwie zusammenpfuscht, dann hat man für später keinen funktionierenden Ansatz.
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
@DocShoe einfach nur erbärmlich, mehr kann man dazu nicht sagen.
Btw. Dissoziale Persönlichkeitsstörungen werden medikamentös behandelt. Falls du dich gerade in psychologischer Behandlung befindest, solltest du das in den Wind schlagen.
... Und es gibt einen Grund, weshalb ich von negativen Bewertungen Abstand nehme. Denk mal nach.
Ich muss mich bei dir entschuldigen, tut mir leid. Ich habe dir fälschlicherweise eine Dissoziale Persönlichkeitsstörung unterstellt, das stimmt natürlich nicht und da lag ich falsch. Du zeigst Anzeichen einer narzistischen Persönlichkeitsstörung.
-
Schluss jetzt damit, keiner von uns hat 12 Semester Medizin oder Psychologie studiert, oder ist Psychiater, um das beurteilen zu können.
Selbstdiagnosen bringen eh in 99 % der Fälle nix. Ich schlage vor, wir einigen uns wieder auf ein friedliches Miteinander.
... Bevor der TO Real-World-Problems lösen kann, muss er zunächst die Grundlagen verstehen, und die versteht er durch 1a vorgegebenen Code nicht, nach meiner Meinung.
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
@hustbaer Jaja, das hätte ich jetzt auch einfach behauptet ... Ist ja auch der einfachere Weg, als das eigene Verhalten mal zu überdenken.
Schauen wir mal, wie's weiter geht. Andere negativ zu bewerten, scheint ja gerade hip zu sein.
Eigentlich ist das im ICD-10 sehr schön beschrieben:
- Fehlendes Schuldbewusstsein oder Unfähigkeit aus negativer Erfahrung, insbesondere Bestrafung, zu lernen,
- Deutliche Neigung, andere zu beschuldigen oder plausible Rationalisierungen für das eigene Verhalten anzubieten, durch welches die Betreffenden in einen Konflikt mit der Gesellschaft geraten sind.
Typisch für diese Persönlichkeitsstörung sind Verantwortungslosigkeit und Missachtung sozialer Normen, Regeln und Verpflichtungen, fehlendes Schuldbewusstsein sowie geringes Einfühlungsvermögen in andere Personen. Oft besteht eine niedrige Schwelle für aggressives oder gewalttätiges Verhalten, eine geringe Frustrationstoleranz sowie eine mangelnde Fähigkeit aus Erfahrung zu lernen.
https://de.wikipedia.org/wiki/Dissoziale_Persönlichkeitsstörung#ICD-10
Das steht doch mit Sicherheit in dem Gutachten Deines Therapeuten!
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
... Und es gibt einen Grund, weshalb ich von negativen Bewertungen Abstand nehme. Denk mal nach.
Weil Du Deinen ganzen Scheißdreck direkt in Prosa ins Forum schreibst?
-
Das
wirdist jetzt nur noch albern @Belli
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Bevor der TO Real-World-Problems lösen kann, muss er zunächst die Grundlagen verstehen, und die versteht er durch 1a vorgegebenen Code nicht, nach meiner Meinung.
Und das ist deiner Meinung nach ein Freibrief Anfängern Code hinzurotzen?
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
@hustbaer Jaja, das hätte ich jetzt auch einfach behauptet ... Ist ja auch der einfachere Weg, als das eigene Verhalten mal zu überdenken.
Schauen wir mal, wie's weiter geht. Andere negativ zu bewerten, scheint ja gerade hip zu sein.
Ja, es ist der einfachere Weg, da hast du völlig Recht. Du irrst dich nur darin wer hier gerade den Fehler macht diesen zu beschreiten.
Und mach dir nicht die Mühe zu Antworten. Nach dem ich diesen Beitrag abschicke wandert auch dieser Account von dir auf meine Blocklist. Weil ich besseres zu tun habe als mit trotzigen Kindern zu streiten.
-
Nein, aber ein Freibrief dafür, sich an die Anforderungen zu halten.
Schade, dass @hustbaer auch dem Lager der Realitätsverweigerer angehört.
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
Nein, aber ein Freibrief dafür, sich an die Anforderungen zu halten.
><((((*>
-
So irgentwie habe ich das Gefühl dass du den Code absichtlich schlecht gemacht hast. NIcht damit @Lumberjack etwas lernt, sondern damit du wieder provozieren kannst und so eine DIskussion startet.
Du sprichst von Realitätsverweigerung? Ja das sehe ich. DIch interresiert dein Speicherloch nicht, deinen völlig veralteten Code, die Verwendung von intrinischen Listen, deine Fehler im Code, dein schlechtes Design,...
-
@Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
DIch interresiert dein Speicherloch nicht,
Darum geht es ja, die Liste wird lediglich einmal zum Testen in der
main
"angelegt". Danach ist das Programm fertig. Ich sehe da kein Speicherloch.Provozieren möchte ich gewiss nicht, es war halt nicht wider besseres Wissen.
Und hustbaer schmollt, nicht ich.
-
@cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
@Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:
DIch interresiert dein Speicherloch nicht,
Darum geht es ja, die Liste wird lediglich einmal zum Testen in der
main
"angelegt". Danach ist das Programm fertig. Ich sehe da kein Speicherloch.Und das soll einem Anfänger helfen?