legaler code?



  • hi, ist das hier legaler cpp code?

    class bla
    {
      int* ptr;
      public:
        bla : ptr(new ptr[3]), ref(ptr[0]){};
        ~bla(){delete[] ptr];
        int& ref;
    };
    


  • refenrenzinitilisor schrieb:

    hi, ist das hier legaler cpp code?

    Nein, der Code ist illegal. Bitte keinen gesetzlich verbotenen Code posten.



  • In Zeile 5 sollte statt new ptr[3] ein new int[3] stehen.Und in Zeile 6 hast du eine eckige Klammer statt einer Geschwungenen. Ansonsten sieht es gut aus.



  • Im Destruktor fehlt die abschließende Klammer "}". Was soll ref(ptr[0]) heißen? Und warum ist ref public?

    @Polizei: musste so lachen 😃



  • [Rewind] schrieb:

    Was soll ref(ptr[0]) heißen?

    Na, dass sich ref auf ptr[0] bezieht.

    [Rewind] schrieb:

    @Polizei: musste so lachen

    Ja, der war echt gut! 👍



  • So ging es nicht.

    class bla
    {
      int& ref;
      int* ptr;
      public:
        bla : ptr(new int[3]), ref(ptr[0]){};
        ~bla(){delete[] ptr};
    };
    


  • übrigens schrieb:

    So ging es nicht.

    class bla
    {
      int& ref;
      int* ptr;
      public:
        bla : ptr(new int[3]), ref(ptr[0]){};
        ~bla(){delete[] ptr};
    };
    

    Es kompiliert, aber es sauft ab, meinst du?
    Die Member der Klasse werden in der Reihenfolge ihrer Dekleration in der Klasse und nicht in der Reihenfolge in der Initialisierungsliste initialisiert. ref erhält also den Wert ptr[0] bevor ptr überhaupt einen Wert hat. Folge: ref zeigt ins Nirvana.
    Einfach in der Klasse die Deklerationen von ref und ptr vertauschen, dann funktioniert das auch.



  • EOutOfResources schrieb:

    [Rewind] schrieb:

    @Polizei: musste so lachen

    Ja, der war echt gut! 👍

    ich auch :DDD
    und ich bin immer noch dran 😃



  • Himmelherrgottnochmal, lern die Syntaxregeln von C++:

    class bla
    {
        int& ref;
        int* ptr;
    
    public:
        bla()
        :ptr(new int[3])
        ,ref(ptr[0])
        {}
    
        ~bla()
        {
            delete[] ptr;
        }
    };
    

    Auch ein Konstruktor darf Argumente übernehmen, und eine Anweisung endet mit ';'. Kann es sein, dass dir Klassen noch neu sind?



  • Glühbirne schrieb:

    int& ref;
        int* ptr;
    

    Ach ja, die Deklarationen noch vertauschen. Sonst gibt es meines Wissens Probleme, weil die Referenz nach nirgendwo zeigt, weil trotz der Reihenfolge der Zuweisung die Deklaration entscheidend ist. Die Referenz bekommt einen (fehlerhaften) Wert, dann bekommt der Zeiger seinen Speicher, und die Referenz hat das nachsehen.

    Aber wenn ich du wäre, würde ich den Quatsch mit der Referenz sein lassen. Was hält dich davon ab,

    ptr[0]
    

    zu schreiben?


Log in to reply