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 sollte

    mfg
    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


Anmelden zum Antworten