Array-Dimension erst im Konstruktor initialisieren



  • Wie ist es möglich ein gewöhnliches (char) Array als Attribut einer Klasse zu verwenden und die Dimension erst während der Objekterstellung, also der Initialisierungsphase zu definieren? Beisplielsweise:

    class Test{
    private:
    //Feld als Attribut, dessen Dimension erst mit Objekterstellung
    //festgelegt werden soll:
       char cFeld[];
    public
    //Konstruktor
       Test(int array_groesse);
    ...
    }
    

    Das geht ja schon aus dem Grund nicht, da bei der initialisierung des Feldes im privaten Bereich der Klasse der Kompiler schon gerne die Dimension wüsste. Auch wüsste ich nicht, wie man, sofern das gehen würde, die größe bei der Erstellung des Objektes dem Konstruktor mitgeben kann.

    Kennt jemand die Lösung des Problems?

    MfG
    DS



  • Wieso benutzt du ein Array wenn du dynamisch die Göße verändern mußt? Benutze doch einen zweidimensionalen Vektor. Der ist zwar nicht notwendig "rechteckig" aber wenn du beim Füllen aufpasst ist er "rechteckig".

    Gruß Goran



  • Wenn du ein dynamisches Array brauchst, wieso verwendest du dann keins?

    class Test{
    private:
    //Feld als Attribut, dessen Dimension erst mit Objekterstellung
    //festgelegt werden soll:
       char* cFeld;
    public
    //Konstruktor
       Test(int array_groesse) { cFeld = new char[array_groesse]; };
    ...
    }
    

    oder nimm nen std::vector<char> und resize den auf array_groesse.



  • Dr$arez schrieb:

    Wie ist es möglich ein gewöhnliches (char) Array

    Nenn doch bitte mal ein Beispiel für ein ungewöhnliches char array...

    Das:

    char arr[100];
    

    und das:

    char* arr = new char[100];
    

    sind beides ganz gewöhnliche char-arrays die sich auch komplett gleich verhalten. Du kannst z.B. sowas machen:

    char* arr = new char[100];
    char x = arr[50];
    

    der einzige Unterschied ist die Art der Speicherverwaltung. das statische array wird auf dem Stack angelegt und ist daher wie der Name schon sagt statisch, kann also zu Laufzeit nicht mehr verändetr werden.

    das dynamische array liegt dagegen auf dem heap, was zwar von der Speicehrverwaltung aufwendiger ist, dafür aber den Vorteil des Dynamsichen mit sich bringt... Es kann eben zur Laufzeit verändetr werden.



  • im destruktor natürlich "delete" (Speicher wieder freigeben) nich vergessen:

    ~Test(){ delete[] cFeld; }
    

    🙂



  • danke... ich war ein wenig blind (als greenhorn) dynamisches array im heap war das, was ich gesucht habe

    danke danke... echt feines forum 🙂



  • Ehm, und die Größe würde ich mir auch irgendwo merken. Aber dann kann man gleich das hier machen:

    class Test{
    private:
    //Feld als Attribut, dessen Dimension erst mit Objekterstellung
    //festgelegt werden soll:
       std::vector<char> cFeld;
    public
    //Konstruktor
       Test(int array_groesse) : cFeld(array_groesse)
       {}
    ...
    }
    


  • class Test
    { 
       std::vector<char> feld;
    public:
       Test(int size)
       {
    	   feld.reserve(size);
       }
    };
    

    MfG



  • Du meinst nicht zufällig resize ?


Anmelden zum Antworten