Suchfunktion in einer Klasse mit mehreren Instanzen



  • Ich finds ja schade. Hat immer viel Code gezeigt, und auch wenn mal schlechter Code darunter gewesen ist, auch davon kann man lernen, solange andere ihn korrigieren.



  • @zeropage

    Ich finds ja schade. Hat immer viel Code gezeigt, und auch wenn mal schlechter Code darunter gewesen ist, auch davon kann man lernen, solange andere ihn korrigieren.

    Das finde ich bezogen auf Fragender ein wenig widersprüchlich, da Selbstreflektion war noch nie seine Stärke war. Und eine pampige Antwort der Form

    Keiner der Kritikpunkte, bis auf 3., ist gerechtfertigt. Das war's dann hier für mich, viel Spaß noch bei dem Unsinn."

    habe ich ehrlich gesagt schon erwartet.

    Wenn ich meinen Code nicht präsentiert hätte, dann hätte @Lumberjack einen völlig veralteten und fehlerhaften Eindruck von modernem C++ bekommen. Vielleicht mag man von schlechten Code etwas lernen können, dieser ist aber mindestens im gleichen Maße gefährlich, da alte totgesagte Fehler so immer wieder ans Licht kommen und die Anfänger verwirren.



  • @Quiche-Lorraine sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:

    Wenn ich meinen Code nicht präsentiert hätte, dann hätte @Lumberjack einen völlig veralteten und fehlerhaften Eindruck von modernem C++ bekommen.

    Aber Du hast ihn ja korrigiert. Also ist doch gut. Ich meine auch, zum Lernen gehört auch die Unterschiede in der Codequalität zu erkennen. Als blutiger Anfänger hat man erst mal einen riesigen Pool an Informationen, die man nicht einordnen kann, aber mit der Zeit, wenn man am Ball bleibt, fängt man doch an, die Spreu vom Weizen zu trennen.

    So funktioniert das ja auch bei anderen Themen. Je mehr man sich damit beschäftigt, desto besser kann man differenzieren. Jedenfalls kenn ich das so.

    Und ich denke, bei jedem Thema sind die tatsächlichen Könner eine Minderheit, weshalb schlechte Angewohnheiten nun mal öfters auftreten. Aber davon kann man eben auch lernen.



  • @zeropage

    Bei Fragendem hat das ja immer noch ein Nachspiel. Erst versucht er, seinen Ansatz iwie zu rechtfertigen bzw. die Kritik als unberechtigt darzustellen, und wenn das nicht klappt lenkt er vom Thema ab. Dann muss man ein zweites/drittes Mal zeigen, dass er daneben liegt und gleichzeitig den Thread wieder in die richtige Richtung lenken.
    Insgesamt ein schwieriger Charakter.

    Edit:
    Ich will mich jetzt nicht durch all seine Beiträge wühlen, aber was davon war jetzt wirklich gut und brauchbar? Gefühlt 75% seiner Beiträge waren irgendwelche sehr speziellen Fragen, die er alle 2h durch eigene Erkenntnisse ergänzt hat. Das waren meistens Monologe, und wenn jemand nachgefragt oder was anderes vorgeschlagen hat wurde er sofort pampig.
    Insgesamt ein sehr schwieriger Charakter.



  • in 2 wochen ist er mit neuem account wieder hier und macht da weiter wo er aufgehoert hat...



  • Ist ja etwas wild geworden hier 😅
    Bin noch etwas am Üben und tun. Werde demnächst den Code hier posten.


  • Gesperrt

    @Cardiac sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:

    in 2 wochen ist er mit neuem account wieder hier und macht da weiter wo er aufgehoert hat...

    Du kannst dich schon eher freuen ...

    Das Problem ist doch, dass ich schlechte Reviews und schlechte Menschen erkennen kann. Wenn dann auch noch keine Gegenargumentation erlaubt ist, dann hat so ein Forum seinen Zweck verfehlt.

    Die zweite Sache ist die mit den negativen Bewertungen, die mich stört, und die ich auch schon einmal woanders erwähnt hatte. Es sollte mind. eine Schwelle geben, ab der man andere erst schlecht bewerten darf; denn ansonsten wird so eine Funktion bei jeder Meinung, die einem nicht gefällt, ausgenutzt.



  • Das ist jetzt interessant. Ist die eigene Löschung doch eine Affekthandlung, wie ich es schon bei jemand früheren vermutet habe?

    Denn eigentlich will man doch noch weiter teilnehmen?


  • Gesperrt

    @zeropage sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:

    Ist die eigene Löschung doch eine Affekthandlung

    Vielleicht 50 % Affekt und 50 % "eigentlich will ich doch digital Detox machen, und mich nicht ständig über andere ärgern müssen, wie blöd ich doch sei".



  • Und schon wieder zurück



  • account nr3, und seit dem ersten tantrum dennoch nix gelernt.....wundervoll. hauptsache die blocklist hat kein limit /shrug

    nimm direkt 2 downvotes fuer die muehe 😉



  • @cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:

    Das Problem ist doch, dass ich schlechte Reviews und schlechte Menschen erkennen kann. Wenn dann auch noch keine Gegenargumentation erlaubt ist, dann hat so ein Forum seinen Zweck verfehlt.

    Das meinst du wirklich ernst? Fehlende Gegenargumentation? Ausgerechnet von dir? Du hättest ja zB auf meine Kritik eingehen können, dann hätte man im Detail anhand von konkreten Beispielen zeigen können, warum das Murks ist. Stattdessen kam ne pampige Antwort und Accountlöschung. Da biste mit leuchtendem Beispiel vorangegangen, wie man gegenargumentiert. Deine Vorstellung von "Diskussion" ist doch, dass man dir entweder zustimmt, oder keine Ahnung hat und deswegen die Argumente unzulässig sind.

    Die zweite Sache ist die mit den negativen Bewertungen, die mich stört, und die ich auch schon einmal woanders erwähnt hatte. Es sollte mind. eine Schwelle geben, ab der man andere erst schlecht bewerten darf; denn ansonsten wird so eine Funktion bei jeder Meinung, die einem nicht gefällt, ausgenutzt.

    Die meisten Teilnehmer dieses Forum können fachliche Beiträge besser bewerten als du, von den Regulars vermutlich alle. Wenn du drauf hingewiesen wirst, dass deine Beiträge Verbesserungsbedarf haben, stellst du das erst Mal in Frage und wirst patzig. Was soll man dazu noch sagen? Du bist in der Dunning-Kruger Phase "Totale Selbstüberschätzung bei vollkommener Ahnungslosigkeit".

    @Admins:
    Macht ein Split hier Sinn? Mit dem eigentlichen Thema hat das doch schon lange nix mehr zu tun.



  • @Cardiac sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:

    account nr3, und seit dem ersten tantrum dennoch nix gelernt.....wundervoll. hauptsache die blocklist hat kein limit /shrug

    nimm direkt 2 downvotes fuer die muehe 😉

    Gnihihi...
    Vielleicht doch lieber einen Accountnamen und den durchnummerieren?



  • @cyborg_beta sagte in Suchfunktion in einer Klasse mit mehreren Instanzen:

    Das Problem ist doch, dass ich schlechte Reviews und schlechte Menschen erkennen kann.

    Rede dir das mal nicht ein. Du bekommst hier nicht primär Gegenwind weil hier schlechte Menschen sind die's aus unerfindlichen Gründen auf dich abgesehen haben. Das liegt schon an dir, also der Art und Weise wie du hier auftrittst.


  • Gesperrt

    @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:

    1. Fehlendes Schuldbewusstsein oder Unfähigkeit aus negativer Erfahrung, insbesondere Bestrafung, zu lernen,
    2. 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



  • @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



  • @cyborg_beta

    Dann benutzen wir mal Occam's Razor. Es gibt hier zwei Möglichkeiten:

    1. Man selbst leidet an einer Persönlichkeitsstörung.
    2. 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 nicht std::unique_ptr<> oder besser std::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?


  • Gesperrt

    @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.


  • Gesperrt

    @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.


Anmelden zum Antworten