Anfängerfragen
-
Kamelkacken schrieb:
Er macht das so lange bis ich auch die beiden vektorzeilen 3 und 4 lösche. Wie kann ich das umgehen? Will mit dem Vektor doch nur eine Liste deklarieren aber noch nichts definieren.
DocShoe schrieb:
Zeile 3 sorgt mit Sicherheit auch für interessante Effekte bei der Ausgabe. Bist du dir sicher, dass du wirklich 5 Karteileichen brauchst?
-
Ok benutze jetzt zeiger. Jetzt werden die instanzen auch nicht mehr direkt nach dem erstellen geloescht xD.
Stattdessen stuerzt das Programm ab, ach ja...woran koennte das liegen?
vector <account> *kundenliste (0); vector <account> :: iterator i; if (auswahl == 1) { cout << "Neues Konto wird erstellt..\n"; account kunde; kundenliste->push_back (kunde); }
-
kamelkacke schrieb:
Stattdessen stuerzt das Programm ab, ach ja...woran koennte das liegen?
Ok benutze jetzt zeiger.
-
vector <account> *kundenliste (0);Nur um das mal klarzustellen: Hier definierst du einen Zeiger
kundenliste, der mit 0 initialisiert wird. Kein Zeiger auf einen initialisiertenvector.Edit: SeppJ, macht Subtilität dich geil?
-
Danke ich glaub ich habs jetzt. Irgendwelche Einwände?
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; } }
-
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 schreibeIf (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"?
-
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.
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.
-
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); }