Klassenfehler
-
Hallo, ich habe ein Problem mit meiner Klasse.
In einer Funktion wird auf ein Shape drauf zugegriffen, was ich vorher in einer anderen Funktion erstellt habe.
Hier der Code:
.h
class cls_Ampel{ public: cls_Ampel(); // Konstruktor ~cls_Ampel(); // Destruktor initAmpel(int i_x, int i_y); // Ampel zeichnen changeStatus(TTimer *tim, int i_Rot, int i_Gelb, int i_Gruen); rot(TTimer *timer); // Ereignis, was ausgeführt werden soll, // wenn eine ampel auf rot springt private: TShape *sh_bgAmpel; TShape *ampel_red; TShape *ampel_yellow; TShape *ampel_green; int i_Status; // Speicherung des Statuses int i_ampX; // Position der X-Koordinate int i_ampY; // Position der Y-Koordinate };.cpp
#include "ampel_p1_u1.h" #include "cls_ampel.h" // Konstruktor cls_Ampel::cls_Ampel(){ TShape *sh_bgAmpel; TShape *ampel_red; TShape *ampel_yellow; TShape *ampel_green; i_Status = 0; } // Ampel zeichnen cls_Ampel::initAmpel(int x, int y){ i_ampX = x; // X-Koordinate speichern i_ampY = y; // Y-Koordinate speichern //Hintergrund der Ampel TShape *sh_bgAmpel = new TShape(Form1); sh_bgAmpel->Shape = stRectangle; sh_bgAmpel->Width = 40; sh_bgAmpel->Height = 120; sh_bgAmpel->Top = i_ampY; sh_bgAmpel->Left = i_ampX; sh_bgAmpel->Brush->Color = clBlack; sh_bgAmpel->Parent = Form1; //Rot TShape *ampel_red = new TShape(Form1); ampel_red->Shape = stCircle; ampel_red->Brush->Color = clRed; ampel_red->Width = 35; ampel_red->Height = 35; ampel_red->Top = i_ampY+3; ampel_red->Left = i_ampX+3; ampel_red->Parent = Form1; //Gelb TShape *ampel_yellow = new TShape(Form1); ampel_yellow->Shape = stCircle; ampel_yellow->Brush->Color = clYellow; ampel_yellow->Width = 35; ampel_yellow->Height = 35; ampel_yellow->Top = ampel_red->Top + 38; ampel_yellow->Left = i_ampX + 3; ampel_yellow->Parent = Form1; //Gruen TShape *ampel_green = new TShape(Form1); ampel_green->Shape = stCircle; ampel_green->Brush->Color = clGreen; ampel_green->Width = 35; ampel_green->Height = 35; ampel_green->Top = ampel_yellow->Top + 38; ampel_green->Left = i_ampX + 3; ampel_green->Parent = Form1; } cls_Ampel::changeStatus(TTimer *tim, int i_Rot, int i_Gelb, int i_Gruen){ switch(i_Status){ case 0: ampel_red->Brush->Color = clYellow; i_Status = 1; tim->Interval = i_Rot; break; case 1: ampel_red->Brush->Color = clBlue; i_Status = 0; tim->Interval = i_Gelb; break; } } cls_Ampel::rot(TTimer *timer){ } // Destruktor cls_Ampel::~cls_Ampel(){ }An den stellen in der switch case abfrage
(ampel_red->Brush->Color = clYellow; oder ampel_red->Brush->Color = clBlue; ), kommt eine "Zugriffsverletzung an Adresse ..." Fehlermeldung.
Wenn diese Zeile auskommentiert wird, kommt keine Meldung mehr.
Was habe ich in der Deklaration nun falsch gemacht. weiß da nicht weiter.
Ich bedanke mich schon einmal.
gruß
thorsten
-
bist du dir auch 100% sicher dass du auch diese initAmpel() funktion aufgerufen hast und somit die klassen mit new erstellt hast?
mfg
BigNeal
-
Du darfst in der Init- Routine keine neue Variablen anlegen!!!
Nimm einfach die in private: angekegten!
TShape *ampel_red = new TShape(Form1);
wird
ampel_red = new TShape(Form1);
-
DerAltenburger schrieb:
Du darfst in der Init- Routine keine neue Variablen anlegen!!!
stimmt

so genau habe ich mir das gar nicht angeschaut
aber habe mich gewundert was das im konstruktor solltemfg
BigNeal
-
ok, Du hast da etwas gründlich mißverstanden.
Du deklarierst zwar formularweit gültige Zeiger auf die TShapes, aber Du verwendest diese nicht. Nur dort, wo Du TShape* blablabla = new TShape(); verwendest erzeugst Du tatsächlich eine verwendbare Instanz. Da Du jedoch den Typ bei der Erzeugung nochmals angibst, verwendest Du nicht die formalurweit gültigen Zeiger aus dem Header der Form, sondern erzeugst neue Zeiger, gleichen Namens, die aber nur innerhalb der Funktion gültig sind. Am Ende der Funktion sind diese nicht mehr verwendbar, da der Zeiger seinen Gültigkeitsbereich verläßt und Du hast keine Möglichkeit mehr auf das TShape-Objekt zuzugreifen.
Wenn Du (sinnvollerweise im Konstruktor) die TShapes erzeugst und im Destruktor wieder 'deletest' kannst Du in allen Funktionen mit ihnen arbeiten.
Im Konstruktor:ampel_yellow = new TShape(Form1);Grüße Joe_M.
-
Das soll mir eine Lehre sein, so lange Beiträge zu tippen...

-
Mensch jungs, ich danke euch!!
es sind halt manchmal die kleinen dinge die aufhalten.
gruß thorsten