Anfängerfragen



  • Jetzt ist die Exception Safety dahin.
    Speicher einfach Accounts ohne Zeiger, nutzt den DefCtor von vector.



  • kamelkacke schrieb:

    Danke ich glaub ich habs jetzt. Irgendwelche Einwände?

    Du erzeugst Memory Leaks.

    Bleib doch bitte dabei, dass du die Instanzen speicherst und nicht Zeiger darauf.



  • Probierst du auch aus, was du da postest?

    vector <account*> kundenliste (0);
    vector <account*> :: iterator i;
    
    if (auswahl == 1) 
    {
       cout << "Neues Konto wird erstellt..\n";
       account* kunde = NULL;
       kunde = new account;    
       kundenliste.push_back (kunde);
       for (i=kundenliste.begin (); i!=kundenliste.end (); i++) 
       {
          cout << *i << endl;
       }
    }
    

    Du gibst die Zeiger aus, nicht die Kundendaten. Bei der Ausgabe hätte dir das auffallen können.



  • Weiss ich. Aber darum gehts nicht sondern ums instanzen erstellen und speichern. Erstmal.

    Wenn ich ohne Zeiger arbeite stehe ich doch wieder am Anfang wo das Programm schon beim initialisieren der vectorliste ne instanz erstellen will und die direkt nach dem erstellen wieder löscht..

    Und in wie fern erzeuge ich memoryleaks?
    Wenn ich im destructor schreibe

    If (kunde != NULL) {
    delete kunde;
    kunde = NULL;
    }
    

    Dann entsteht doch keins oder?

    Leute bitte gebt mir bitte code ich hänge schon 2 Tage an diesen Problemen und übersehe wohl eine kleinigkeit und komme echt nicht drauf...ich mein die Instanzen werden direkt nach dem erstellen gelöscht was soll das für nen grund haben? Google sagt mir nichts



  • ohne jemals echten COde deines Programms gesehen zu haben orakel ich:

    Du erzugst eine lokale Variable, die dann natürlich am Ende des Scopes zerstört wird. Nun versuchst du das Problem zu lösen, indem du die Variable mit new erzeugst, aber da der zeiger auf die variable genauso kaputt geht, kommst du da nie wieder dran und erzeugst ein Speicherleck.

    Nochmal der Link:

    http://www.catb.org/esr/faqs/smart-questions.html

    Wenn du den Link nicht verstehst: könntest du verstehen wovon du sprichst, wenn du deinen Startpost liest? Wie erwartest du hilfe? welchen Code sollten wir überhaupt schreiben?

    Wenn du hilfe willst, solltest du es einfach machen, Hilfe zu geben. Es ist erstaunlich, dass du überhaupt antworten krigst, obwohl die Leute offensichtlich alle Raten müssen, wovon du sprichst.



  • kamelkacke schrieb:

    Wenn ich ohne Zeiger arbeite stehe ich doch wieder am Anfang wo das Programm schon beim initialisieren der vectorliste ne instanz erstellen will und die direkt nach dem erstellen wieder löscht..

    vector <account> kundenliste (5);
    vector <account*> kundenliste (0);

    Warum hast du erst "5" verwendet und später "0"?


  • Mod

    Wie lernst du C++? Ich sehe auch deine Threads, ich bin sicher, das Problem ist folgendes:

    Leute bitte gebt mir bitte code

    Du schreibst Code ab, ohne ihn zu verstehen. Die Programme in diesem Thread sind da keine Ausnahmen. Du hast bereits auf alle deine Fragen hier im Thread mehrmals Antworten erhalten, hast aber gar nicht gemerkt, dass dies die Antworten sind, die du suchst, da du deinen eigenen Code nicht verstehst. Weil du ihn nicht selber geschrieben hast. Wie soll man dir da helfen? Sollen wir dir zu jedem kleinen Problemchen eine Komplettlösung geben?

    Du musst selber verstehen, was du tust. Programmieren ist nicht Copy&Paste und ein bisschen anpassen. Du musst von jedem einzelnen Zeichen in deinem Programm genau wissen, wo und warum du es setzt. Wenn du etwas nicht verstehst, musst du es nachschlagen. Stichworte wurden dir gegeben, Referenzen zum vector sind ebenfalls bekannt.

    Hier ist es tatsächlich ein einzelnes Zeichen welches dein Problem verursacht (oder eher: eines deiner Probleme, andere Probleme am Code hast du noch gar nicht bemerkt), eben weil du es wohl irgendwo blind abgeschrieben hast. Du musst mindestens die Grundlagen von C++ können, sonst machen Erklärungen keinen Sinn. Und ohne dass du unsere Erklärungen verstehst, macht es keine Sinn, dir zu helfen.



  • daddy_felix schrieb:

    kamelkacke schrieb:

    Wenn ich ohne Zeiger arbeite stehe ich doch wieder am Anfang wo das Programm schon beim initialisieren der vectorliste ne instanz erstellen will und die direkt nach dem erstellen wieder löscht..

    vector <account> kundenliste (5);
    vector <account*> kundenliste (0);

    Warum hast du erst "5" verwendet und später "0"?

    Wegen dem karteileichentip.

    @Seppj:

    Ich schreibe nichts ab. Aber kann gut sein dass ich einiges nohlchmal nachblättern sollte...na dann.



  • kamelkacke schrieb:

    Wegen dem karteileichentip.

    ok. Und was passiert, wenn du es mit

    vector <account> kundenliste (0);

    versuchst?



  • Hat jemand mal die zeitliche Verteilung des Auftretens von blurry und kamelkacke wissenschaftlich untersucht?



  • daddy_felix schrieb:

    kamelkacke schrieb:

    Wegen dem karteileichentip.

    ok. Und was passiert, wenn du es mit

    vector <account> kundenliste (0);

    versuchst?

    Die Antwort wird wohl nicht die sein, die du gern lesen würdest (glaub ich)... aber es passiert genau das selbe wie mit 5.



  • EinerVonUns schrieb:

    Hat jemand mal die zeitliche Verteilung des Auftretens von blurry und kamelkacke wissenschaftlich untersucht?

    blurry trollt im Javaforum rum und ist sicher nicht kamelkacke. dafür ist blurry in seinem auftreten viel zu ignorant gegenüber nachfragen.


  • Mod

    kamelkacke schrieb:

    Die Antwort wird wohl nicht die sein, die du gern lesen würdest (glaub ich)... aber es passiert genau das selbe wie mit 5.

    Irgendwie glaube ich dir das nicht. Sicherlich lügst du nicht mit Absicht, aber vermutlich machst du mindestens noch was anderes falsch. Oder es wird aneinander vorbei geredet. Da der Thread schon eine Weile geht:
    Zeig mal den aktuellen Code -> http://www.c-plusplus.net/forum/304133
    Beschreib genau, um welchen Fehler es gerade geht -> http://www.c-plusplus.net/forum/200753



  • Kann es sein, dass du in "account" dynamisch Speicher holst und diesen im Destruktor freigibst?

    In dem Fall hast du vermutlich die "Rule of three" (-> Google) verletzt...



  • Also ich trolle nicht rum.. ich hab seit 2 Tagen nur diesem Code im Kopf..

    Hier mal der gesamte Code. Er ist echt simpel.

    1. Eine Klasse die einige Zeilen in Anspruch nimmt aber nur aus einem Konstruktor besteht, paar Variablen die im Konstruktor definiert werden, einem destruktor und einer zeigedaten funktion.

    2. Eine sehr kurze Klasse die komplett Baustelle ist. Aber selbst wenn ich keine Instanz von ihr erstelle, passiert das worüber ich ganze Zeit rede.

    3. <<operator überlader, der auch mist ist, aber mit dem Fehler nichts zu tun haben kann....glaub ich

    4. Main funktion, die zu 90% aus Menuedefinition und Ausgabe besteht.

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    static int kundenzaehler = 0;
    
    void personalmenue ();
    
    class account {
    
    	friend class angestellter;
    
    	public:
    	   account () {
    	   	do {
    	   	cout << "Bitte geben Sie Ihren Namen ein\n";
    	   	cin >> name;
    	   	cout << "Bitte geben Sie Ihren Vorname ein\n";
    	   	cin >> vorname;
    	   	cout << "Bitte geben Sie Ihren Kontostand ein\n";
    	   	cin >> kontostand;
    	   	do {
    	   	cout << "Bitte Ihre Wunschgeheimzahl eingeben (4 Ziffern)\n";
    	   	cin >> geheimzahl;
    	   	} while (geheimzahl >= 10000 || geheimzahl <= 999);
    	   	cout << "Sind die eingegebenen Daten korrekt?\n\n";
    	   	cout << "Vorname    : " << vorname << endl;
    	   	cout << "Name       : " << name << endl;
    	   	cout << "Kontostand : " << kontostand << endl;
    	   	cout << "Geheimzahl : " << geheimzahl << endl << endl;	   
    	   	cout << "(1) Ja" << endl;
    	   	cout << "(2) Nein" << endl;
    	   	cin >> bestaetigung;
    
    	   	} while (bestaetigung != 1);
    
    	   	cout << "Ihr Bankkonto wurde erstellt";
    	   	kundenzaehler++;
    	   	kundenid = kundenzaehler;
    	   	cout << "Aktuell hat die Bank " << kundenzaehler << " Kunden\n\n";
    	   }
    
    	~account () {
    		kundenzaehler--;
    		cout << "Ihr Bankkonto wurde erfolgreich geloescht\n"
    		              "Das Geld behalten wir allerdings\n"
    		              "Schoenen Tag noch\n";
    	}
    
    	int bestaetigung;	
    
    	void zeigedaten () {
    	   	cout << "Ihre aktuellen Daten sind:\n\n";
    	   	cout << "Vorname    : " << vorname << endl;
    	   	cout << "Name       : " << name << endl;
    	   	cout << "Kontostand : " << kontostand << endl;
    	   	cout << "Geheimzahl : " << geheimzahl << endl << endl;	   
    	   	}		
    
    	private:
    	   string name;
    	   string vorname;
    	   int geheimzahl;
    	   long long kontostand;
    	   int kundenid;
    };
    
    class angestellter {
    
    	public:
    
       	angestellter () {
       		cout << "";}
        ~angestellter () {
        	cout << "Angestellter geloescht";
        }
    
        void transfer (account *cash, account *cash2, account *id1, account *id2) {
        	cout << "bla";    	
        }
    
        void kundendaten () {
        	cout << "test";
        }
    
        void kundenloeschen () {
        	cout << "test";
        }
    
        private:
    
        account *paccount1;    
        account *paccount2;
        account *pid1;
        account *pid2;
    };
    
    ostream& operator << (ostream& os, account const& a) {
    	os << a.bestaetigung;	
    	return os;
    	}	
    
    int main () {
    
    	int auswahl = 0;
    
    	angestellter personal;
    
    	vector <account> kundenliste (0);
    	vector <account> :: iterator i;
    
    	do {
    
    	cout << "Willkomen bei der Mr.Nice International Bank AG..\n\n"
    	              "Menueauswahl:\n"
    	              "(1) Neues Konto erstellen\n"
    	              "(2) Einloggen\n"
    	              "(3) Konto aufloesen\n"
    	              "(4) Beenden\n";
    	cin >> auswahl;   
    
    	if (auswahl == 1) {
    		cout << "Neues Konto wird erstellt..\n";
    		account kunde;
            kundenliste.push_back (kunde);
    		for (i=kundenliste.begin (); i!=kundenliste.end (); i++) {
            cout << *i << endl;
    		}
    	}
    
    	else if (auswahl == 2) {
    		cout << "Einloggen\n\n";
    	}
    
    	else if (auswahl == 3) {
    		cout << "Konto wird geloescht\n\n";
    	}	
    
    	else if (auswahl == 4) {
    		cout << "Vielen Dank fuer Ihren Besuch\n"
    		              "Beehren Sie uns bald wieder";		
    	}
    
    	else if (auswahl == 123454321) {
    	personalmenue ();
    	}
    
        else {
        	cout << "Ungueltige Eingabe\n\n";
            }
    	} while (auswahl != 4);    
    }
    
    void personalmenue () {
    
    	int personalauswahl = 0;
    
    do {
    
    		cout << "Personalmenue\n\n"
    		              "(1) Ueberweisungen taetiegen\n"
    		              "(2) Konto loeschen\n"
    		              "(3) Kundenanzahl ausgeben\n"
    		              "(4) Einzelne Kundendaten ausgeben\n"
    		              "(5) Alle Kunden ausgeben\n"
    		              "(6) Beenden\n";
    	    cin >> personalauswahl;
    
    	    if (personalauswahl == 1) {
    	    	cout << "Banktransfer\n";
    	    }
    
    	    else if (personalauswahl == 2) {
    	    	cout << "Konto loeschen\n";
    	    }
    
    	    else if (personalauswahl == 3) {
    	    	cout << "Momentan befinden sich " << kundenzaehler << " in der Datenbank\n\n";
    	    }	
    
    	    else if (personalauswahl == 4) {
    	    	cout << "Einzelne Kundendaten ausgeben\n\n";
    	    }
    
    	    else if (personalauswahl == 5) {
    	    	cout << "Alle Kundendaten ausgeben\n\n";	    	        
    	    }
    
    	    else if (personalauswahl == 6) {
    	    	cout << "Personalprogramm wird beendet\n\n";
    	    }	    
    
    	    else {
    	    	cout << "Ungueltige Auswahl\n\n";
        	}	       	       	       	    	 	    	 	    
        } while (personalauswahl != 6);  
    }
    


  • Und was genau ist das Fehlverhalten?

    Meine Fresse, dir muss man echt jeden Schei** aus der Nase ziehen 😞


  • Mod

    Da sind sowohl die 5 leeren Unsinnsinstanzen drin, von denen du gesagt hast, dass du sie weg gemacht hast, als auch, wie von daddy_felix vermutet, gleich mehrere Verletzungen der Regel der großen Drei. Das heißt, trotz mangelnder Fragestellung (siehe Beitrag von otze) haben die Helfer sogar richtig geraten. Trotz ihrer Antworten sind aber genau diese Fehler noch da. Die Regel der großen Drei kann ich ja verstehen, das ist für Anfänger nicht einfach*. Aber die 5 Instanzen im vector nach mehrmaligem Hinweis?

    Dein Klassendesign ist sehr merkwürdig. Konstruktor und Destruktor einer Klasse sind nicht vergleichbar mit dem Konzept einer Kontoeröffnung oder -schließung. Der Rest der Klassengestaltung ist auch nicht so toll, aber da andere Baustellen gerade dringender sind (immer noch die 5 Instanzen!) lasse ich mich dazu mal nicht groß aus.

    *: Und ausgerechnet Anfänger scheinen magisch das Bedürfnis zu verspüren, ihre Klassen so zu gestalten, dass sie die Regel der großen Drei benötigen. Ich kann mich kaum erinnern, wann ich das letzte Mal wirklich produktiv einen selbstdefinierten Destruktor geschrieben habe.



  • Oh man sry sry. Das Problem ist:

    1. dass statt der Menueausgabe direkt eine Instanz erzeugt wird.
    2. dass die Instanz direkt gelöscht wird.

    Zu Sepp die war 5 da weil ich nochmal geguckt habe ob sich das Vehalten nicht doch irgendwie anders bemerkmbar ist. Also ob ich was übersehen habe. Was leider nicht der Fall ist.


  • Mod

    kamelkacke schrieb:

    1. dass statt der Menueausgabe direkt eine Instanz erzeugt wird.
    2. dass die Instanz direkt gelöscht wird.

    Die Antworten da drauf sind immer noch die gleichen, die schon mehrmals gegeben wurden. Ob mit oder ohne 5, so ist immer noch die Korrespondenz Kontoeröffnung/schließung <-> Konstruktor/Destruktor nicht zum Klassenkonzept von C++ passend (mit etwas Drücken kann man es vielleicht da rein quetschen, aber es wird nicht gut) und selbst wenn, dann wurde es technisch falsch umgesetzt (Regel der großen Drei).



  • Nagut dann lass ixh mi das nochmal alles auf der Zunge sergehen. Vielen Dank an alle für eure Geduld und Einsatz!!


Anmelden zum Antworten