Dynamisches Klassenobjekt erstellen und wieder löschen.



  • Hallo Liebes Forum, ich habe eine kleine Frage und zwar komme ich bei meiner Personaldatenbank in C++ nicht weiter. Vielleicht könnt ihr mir helfen =).

    Also ich habe eine Klasse erstellt die über den Konstruktor alle benötigten Strings bekommt um das Objekt zu erstellen.

    Dann entsprechend 10 Pointer auf die Klasse für Dynamisches anlegen der Mitarbeiter zur Laufzeit.

    Personaldaten *MA_ptr[10];

    In der entsprechenden Funktion bekommt der Pointer mit new die Objekte übergeben und wird auch soweit erstellt.

    maptr[Datensätze] = new Personaldaten(Menue_Punkt_Einseingabe.at(1), Menue_Punkt_Einseingabe.at(0), Menue_Punkt_Einseingabe.at(2), Menue_Punkt_Einseingabe.at(3),Datensätze+1);

    Menue_Punkt_Einseingabe ist der Vektor mit den Strings.

    Allerdings wenn ich einen der Mitarbeiter löschen möchte, dann klappt es nur, wenn ich den letzten in der Liste lösche. Ansonsten kommt Zugriffsfehler beim Anschauen oder beim Schreiben in die ASCII Datei.

    Ich hab einiges probiert aber ich denke, dass ich hier ein bisschen mit dem Pointer falsch rumhantiere.

    if (mptr[s]->getid() == userinput) {
    cout << "\nMitarbeiter " << mptr[s]->getname() << " wurde erfolgreich gekuendigt 😃 !\n";
    mptr[s] = NULL;
    Datensätze--;

    Also die Funktion die den Mitarbeiter löscht setzt den Pointer auf NULL. Allerdings habe ich gemerkt das MA_ptr[0] z.b schon am Anfang nicht NULL ist obwohl keine Daten vorhanden sind. Ich verwechsle da etwas glaube. Mit delete geht es auch nicht. Ich schätze das der Pointer irgendwie komplett weg ist und nicht mehr benutzt werden kann

    Hier ist das ganze Ding.
    https://github.com/kuhumwerfer/Databank

    Ich kann den Quellcode auch gerne hier Posten, wird dann aber ein bisschen viel. Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.

    Wäre für jede Hilfe dankbar.



  • Benutze einen std::vector:

    std::vector<Personaldaten> MA;
    ...
    
    int xxx = static_cast<int>(MA.size());
    MA.emplace_back(Menue_Punkt_Einseingabe.at(1), 
                    Menue_Punkt_Einseingabe.at(0), Menue_Punkt_Einseingabe.at(2), 
                    Menue_Punkt_Einseingabe.at(3), xxx);
    

    Für Datensätze+1 habe ich in xxx die aktuelle Größe des Vectors benutzt. Keine Ahnung wozu das gebraucht wird und ob es ein int sein muss ...



  • Datensätze +1 war nur zur Vergabe der Personal ID, eigentlich unrelevant aber das Casten in Int war trotzdem richtig. Sorry die hatte ich mal kurz vorm schlafen gehen ergänzt und seitdem nicht mehr geändert.

    Die Funktion emplace_back ist mir neu scheint aber zu Funktionieren.
    Ich melde mich nochmal wenn ich es komplett angepasst habe.

    Vielen dank manni 66 =).

    Edit: Also erstellen und abrufen klappt, nur bekomme ich den Mitarbeiter aus dem Vector nicht raus. Personalvector.erase(i).

    Hier die Funktion zum löschen.

    int Funktionen::MAlöschen(std::string userinput, int &Datensätze, std::vector<Personaldaten> &MA) {
    
    	for (auto s = MA.begin(); s < MA.size(); s++) {
    
    		if (MA[s].getid() == userinput) {
    			cout << "\nMitarbeiter " << MA[s].getname() << " wurde erfolgreich gekuendigt :D !\n";
    			MA.erase(s);
    			Datensätze--; 
    		}
    	}
    
    	return Datensätze;
    }
    

    Edit 2: Habs hinbekommen. Lag irgendwie an der Schleife und dem Startpunkt des Vectors.

    int Funktionen::MAlöschen(std::string userinput, int &Datensätze, std::vector<Personaldaten> &MA) {
    
    	for (auto s = 0; s < MA.size(); s++) {
    
    		if (MA[s].getid() == userinput) {
    			cout << "\nMitarbeiter " << MA[s].getname() << " wurde erfolgreich gekuendigt :D !\n";
    			MA.erase(MA.begin() + s);
    			Datensätze--; 
    		}
    	}
    
    	return Datensätze;
    }
    

    Also ich weis das mein Programmierstil wahrscheinlich Augenkrebs verursacht. Dennoch würde ich vielleicht darum bitten mir Verbesserungsvorschläge zu geben was ich besser machen könnte oder welcher Themenbereich als nächstes Sinnvoll wäre. Mir fällt bis jetzt nur ein die Funktionen eher in Klassen umzuwandeln und noch ein paar Variablen auf unsigned oder const setzen.

    An Funktionalität fällt mir jetzt eigentlich nur noch mehr Eigenschaften der Mitarbeiter ein. Hat jemand vielleicht eine Idee, wie das Programm mehr in Richtung realistische Software für ein Unternehmen gehen kann?

    Mir ist bewusst, dass es weit davon entfernt ist aber wäre echt dankbar für eine Richtungsweisung.

    Mein Onkel z.b der macht MYSQL Schulungen, das hätte ich mir vielleicht als nächstes angeschaut, obowhl mein C++ Buch noch einige Seiten übrig hat. (700).



  • Das schöne an dem vector ist doch, dass du nicht selbst die Datensatz-Anzahl zählen/verwalten musst. Daher ist deine Variable "Datensätze" komplett überflüssig - MA.size() enthält doch diesen Wert.

    Außerdem hat deine Lösch-Schleife ein anderes Problem:
    Erstens: "s" ist bei dir der Index. Den würde man im Normalfall per Konvention "i" nennen. (kein direktes Problem)
    Aber: du läufst den vector von vorn nach hinten durch. Überlege die mal, was passiert, wenn es zwei Personen mit derselben ID gibt für den Fall
    a) dass beide direkt hintereinander im vector sind
    b) dass sie nicht direkt hintereinander im vector sind.

    Zum Rauslöschen bestimmter (mehrerer) Elemente aus dem vector würde ich das erase-remove-Pattern vorschlagen. (also MV.erase(std::remove_if(MA.begin(), MA.end(), [&](const Personaldaten&p){return p.getid() == userinput;}), MA.end()); )

    Hoffentlich ist deine ID aber eindeutig. Dann könntest du deine obige Schleife aber nach dem ersten Löschen direkt beenden (break oder return). Allerdings würde ich stattdessen ein einfaches std::find_if (wenn gefunden) gefolgt von MA.erase vorschlagen.



  • Zwen++ schrieb:

    Hat jemand vielleicht eine Idee, wie das Programm mehr in Richtung realistische Software für ein Unternehmen gehen kann?

    ...

    Mein Onkel z.b der macht MYSQL Schulungen, das hätte ich mir vielleicht als nächstes angeschaut,

    Ohne Datenbank ist das ziemlich weit entfernt von realistischer Unternehmenssoftware. Um C++ zu lernen ist das aber eher egal.

    In "echter" Software würde man aber sicher nicht das Alter eine Person speichern, da man nicht an jedem Geburtstag dran denken will, den Wert zu ändern 😉
    Würde man es dennoch tun, wäre es eine Zahl und kein String.



  • Danke wob für die Tipps. Der Vector ist hier wirklich 1000 besser, und wie du sagst brauch ich auch die Datensätze nicht mehr.

    Genau so etwas wollte ich hören manni66, ich schätze MYSQL wäre als nächstes dran, wenn ich c++ mehr verinnerlicht habe.

    Das mit dem Alter stimmt, war aber auch eher Provisorisch vorerst. Ich denke da an einen String des Geburtsdatums der in einen int Wert umgewandelt wird und die Differenz zum heutigen Datum zieht und dann entsprechend ausgibt.

    Aber bis dahin fallen mir bestimmt wieder 10 anderen Sachen ein.
    Danke an alle =).


Log in to reply