Variablen in Klassen
-
Ich habe eine Klasse:
class Klasse { private: std::vector<int> Liste; public: void Anhaengen(int Was); void Entfernen(int Was); }Element; void Klasse::Anhaengen(int Was) { ShowMessage(Liste.size()); Liste.push_back(Was); ShowMessage(Liste.size()); } void Klasse::Entfernen(int Was) { ShowMessage(Liste.size()); Liste.erase(&Liste[Was]); }Die ShowMessages sind zur Kontrolle.
Wenn ich nun z.B.: Element.Anhaengen(5) aufrufe bekomme ich die MessageBoxen 0 und 1. Das ist ja wie erwartet.
Wenn ich nun danach Element.Entfernen(0) aufrufe bekommen ich die MessageBox 0 und eine Zugriffsverletzung, weil die Liste ja leer ist.Warum leert sich die Liste bzw. warum verschwindet Liste[0]???
Danke
-
Hast du eventuell zwischen den beiden Aufrufen noch etwas mit der Liste gemacht?
-
Hallo
Wenn ich nun danach Element.Entfernen(0) aufrufe bekommen ich die MessageBox 0 und eine Zugriffsverletzung, weil die Liste ja leer ist.
Nein du bekommst eine Zugriffsverletzung weil du an erase irgend eine Adresse übergibst aber keinen gültigen Iterator.
Wes willst du denn in Entfernen löschen? Das Element mit dem index Was oder das (die Element(e) mit dem Wert Was?bis bald
akari
-
Hallo
wenn es um das Element mit dem Index Was geht, das geht so :
void Klasse::Entfernen(int Was) { Liste.erase(Liste.begin() + Was); }Eventuell solltest du aber noch prüfen, ob Was kleine ist als Liste.size().
bis bald
akari
-
Mag sein, danke das mit erase hat bisher so geklappt... Das ist ja auch nur ein Bsp.
Das Problem ist, das die Liste sich garnicht verändert.
Ich habe mir einen Timer genommen und gebe in einem Label aller 0,1 sek den Wert von Element.Liste.size() aus. Der bleibt immer 0, obwohl mir die 2. MessageBox in Anhaengen() ja 1 "sagt"?!
Es geht mir nicht um das erase sondern, dass ich auf verschiedene Liste zuzugreifen scheine?!
-
Da LISTE in deiner Klasse private ist, und du hier von einem Timer sprichst, ist das wohl nicht der komplette Code der Klasse
-
Jaja, ich habe Liste auch public gemacht, aber nur zu Testzwecken.
Ich habe den Fehler gefunden:
Die Klassendeklaration habe ich in der Header-Datei (Unit1.h) gemacht.
Nun hab ich Element.Anhaengen() immer aus Unit2 aufgerufen. Wenn ich Element.Anhaengen() von Unit1 aufrufe funktioniert alles wie gewollt.Warum nicht aus Unit2 (Unit1.h ist includiert)?!
-
weil die Deklaration "class Klasse{...}Element;" in jeder Übersetzungseinheit eine eigenständige Variable erzeugt - ein Wunder, daß es da keine Linker-Probleme gab. Versuch mal stattdessen folgendes:
//unit1.h class Klasse{ // alle Elemente der Klasse }; extern Klasse Element; //unit1.cpp #include "unit1.h" Klasse Element; // eventuell auch mit Konstruktor-Parametern //andere .cpp #include "unit1.h"