Anfängerfragen
-
Hi versuche grad was zu programmieren und da stellen sich mir Fragen die ich zur Lösung einiger Probleme brauche. Hoffe ihr koennt mir helfen:
1. Zu Anfang des Programms wird ein Auswahlmenue ausgegeben. Wenn man Menuepunkt '1' auswaehlt, wird automatisch Speicher für eine Klasseninstanz reserviert und eine Instanz wird erstellt.
account *kunde = NULL;
kunde = new account;Danach kommt man wieder ins Auswahlmenue. Auf die erstellte Instanz moechte ich im Auswahlmenue '2' zugreifen (methoden aufrufen). Beim kompilieren kommt aber leider der Fehler, dass die Instanz nicht deklariert wurde.
Ich dachte jede Adresse ist universell aufrufbar wie eine globale Variable.
Wie kann ich das nach meiner Vorstellung nach anpassen?2. Ist das ok, dass bei Menuepunkt '1' jedes mal eine Instanz auf die selbe adresse gespeichert wird?
3. Wie kann man die einzelnen Instanzen ansprechen? In ner for-schleife mit kunde[i]?
Ok bei 3. sagt der compiler: statement cannot resolve adress from overloaded function kunde[i].zeigedaten. wie krieg ich das geregelt? Mit iterator?
-
Du machst was falsch. Sowohl im Programm als auch hier im Forum.
Info
-
zu 1) Warum muss die Instanz überhaupt mit "new" erzeugt werden?
zu 2) Nein, da du (vermutlich) kein delete aufrufst. Das erzeugt ein Speicherleck
zu 3) wenn du die Instanzen in einem std::vector speicherst, könntest du das so machen.
-
Ok etwas editiert..aber klappt leider nicht.
Der compiler zeigt als Fehlerquelle die outputzeile der forschleife an.
"No match operator and account" (verkürzt). Blicke nicht durch..account kunde; vector <account> kundenliste (5); vector <account> :: iterator i; if (auswahl == 1) { cout << "Neues Konto wird erstellt..\n"; kundenliste.push_back (kunde); for (i=kundenliste.begin (); i<kundenliste.end (); i++) { cout << (*i) << endl; } }
-
meine Glaskugel vermutet, dass du den operator<< nicht für den Typ "account" überladen hast.
-
Erbitte inständig um code...ich kann mit der erklaerung nichts anfangen
-
Woher hast du denn "deinen" Code, wenn du selbst nicht weißt, wie er sich verhält bzw. was du falsch machst. daddy_felix hat dir sogar schon verraten, was nicht stimmt.
Edit:
Zeile 3 sorgt mit Sicherheit auch für interessante Effekte bei der Ausgabe. Bist du dir sicher, dass du wirklich 5 Karteileichen brauchst?
-
Ich kann tausende codes schreiben die nicht laufen. Das ist nicht das problem
Den compilertext zu übersetzen auch nicht. Wobei ich trotzdem für eure beteidigung sehr dankbar bin!! Ich kann nur echt nichts mit der erklärung anfangen, mir nicht das geringste darunter vorstellen
-
Was soll den deiner Meinung nach passieren, wenn du "cout << (*i) << endl;" schreibst?
Schau doch mal in dein Grundlagenbuch, was da unter dem Thema "Ausgabe benutzerdefinierter Datentypen" steht.
-
kamelkacke schrieb:
Ich kann tausende codes schreiben die nicht laufen. Das ist nicht das problem
Den compilertext zu übersetzen auch nicht. Wobei ich trotzdem für eure beteidigung sehr dankbar bin!! Ich kann nur echt nichts mit der erklärung anfangen, mir nicht das geringste darunter vorstellenDa ist Eigeninitiative gefragt. daddy_felix hat dir zwei Stichworte genannt: "operator<<" und "überladen". Wenn man das um "C++" ergänzt und mit google sucht bekommst du schon mit dem ersten Treffer ein ausführliches Tutorial.
-
Soll der operator in die klasse als public?
-
Ok, da du offensichtlich entweder nicht mit google umgehen kannst und/oder zu faul bist: C++ Operatorüberladung, Punkt 3.4.
-
Naja hab wohl grad lehrblockade. Also ich hatte den Abschnitt schon gelesen aber ist mir zu komplex...ich lass es erstmal.
Andere Frage: Mein Programm, wenn ich es starte, will sofort eine Instanz einer klasse erschaffen, auch wenn ich "account kunde" lösche.
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.
-
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.