Structur initialisieren



  • Hallo,

    wo kann ich eine struct initialisieren, im Header geht es nicht

    struct GESAMT
         {
            TColor Color;
         	int Time;
         };
         GESAMT** Pointer;
         GESAMT S1 = {clRed,1000}; //Fehler im Header.
    

    Ich könnte eine Instanz von GESAMT im Konstruktor erzeugen und dann
    initialisieren,

    GESAMT S1 = {clRed,1000}; //So gehts.

    habe dann aber eine lokale Instanz im Konstruktor.

    S1 = {clRed,1000} //Fehler



  • Gib deiner struct doch einen Konstruktor und initialisier sie da.
    Was genau willst du erreichen?



  • Hallo,

    ich möchte die struct mit
    GESAMT S1 = {clRed,1000} initialisieren, anstatt
    jeden Member extra zu initialisieren.
    S1.Color = clRed;
    S1.Time = 1000;

    Die Structuren sollen Phasen einer Ampelsteuerung an einer Kreuzung sein.
    (Farben und Zeitdauer der Phase)
    Der Member Time stellt die Länge der Phase da die in den Timerinterval
    geschrieben wird. Die Pointer der Structs werden in das Pointer Array
    geschrieben, so kann über ein Index jede Phase nach und nach ausgeführt werden.

    Gib deiner struct doch einen Konstruktor und initialisier sie da.

    Wie würde soetwas aussehen?



  • Hallo

    das gehört zu den Grundlagen von OOP.

    bis bald
    akari



  • Hallo,

    das mit dem Konstruktor einer Klasse ist mir schon klar, er wird jedesmal
    ausgeführt wenn ein Objkt der Klasse instanziert wird.

    Aus dem Beispiel Grundlagen

    class Integer
        {
        public:
          Integer(int dummy)
          {
          }
        };
    
        void foo(Integer dummy)
        {
        }
    
        int main()
        {
          foo(5);
        }
    

    Es gibt die Klasse Integer mit dem Konstruktor Integer(int dummy);
    Nun existiert eine Funktion foo mit dem Übergabeparameter dummy des
    Typs Integer. Wird nun jedesmal beim Aufruf von foo der Konstruktor
    mit ausgeführt oder wie muss man das verstehen?

    class Test
    {
         private:
                struct A
                {
                      int X;
                      int Y;
                }
    }
    

    Und wie bekommt die struct nun einen Konstruktor?



  • So gehts

    struct TEST
             {
                 TColor Color;
                 int Time;
                 TEST(TColor uColor, int uTime){Color = uColor;Time = uTime;}
             };
    

    Das ganze ist mir allerdings nicht so ganz klar.

    class Integer
        {
        public:
          Integer(int dummy)
          {
          }
        };
    
        void foo(Integer dummy)
        {
        }
    
        int main()
        {
          foo(5);
        }
    


  • Hallo,
    So gefällt mir der Konstruktor besser (ist hier aber Ansichtssache)

    struct TEST
    {
        TColor Color;
        int Time;
        TEST(TColor uColor, int uTime) : Color(uColor), Time(uTime) {}
    };
    

    Ich verwende halt lieber Inititialisierungslisten und finde es ist besser, wenn man sich gleich daran gewöhnt.
    Eine Initialisierung eines bestehenden Objektes von TEST könnte dann so erfolgen.

    TEST S1(clBlue, 10);
    // neu initialisieren
    S1 = TEST(clRed, 1000);
    

    Übrigens kann in deiner struct TEST jetzt nur noch eine Instanz mit Hilfe des dort stehenden Konstruktors erstellt werden. Der Defaultkonstruktor (ohne Argument) existiert jetzt nicht mehr. Wenn du ihn brauchst, mußt du ihn extra noch hinzufügen oder den obigen Konstruktor mit default-Argumenten erweitern.
    z.Bsp. so

    struct TEST
    {
        TColor Color;
        int Time;
        TEST(TColor uColor = clRed, int uTime = 1000) : Color(uColor), Time(uTime) {}
    };
    

    Zur zweiten Frage
    Beim Aufruf von foo(5) wird der Konstruktor von Integer aufgerufen und somit eine Instanz von Integer erstellt, die nur innerhalb von foo gültig ist.



  • Danke für die super Hilfe.

    TEST(TColor uColor, int uTime) : Color(uColor), Time(uTime)
    

    erinnert an

    TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    

    Wie war das auch noch mit dem :?


Anmelden zum Antworten