Statische Array von Zeigern außerhalb der Klasse initialisieren



  • Ich hab ein Array von Zeigern in einer Klasse definiert:

    class test {
        private:
            static int *zrg_arr[10];
        ...
    };
    

    Wie kann ich diese nun außerhalb der Klasse initialisieren, damit ich sie verwenden kann?

    Praktisch irgendwas wie:

    int test :: zrg_arr[0] = NULL;
    


  • Wahrscheinlich so:

    class test
    {
        private:
            static int *zrg_arr[10];
        //...
    };
    
    int *test::zrg_arr[10] = {0,0,0,0,0,0,0,0,0,0};
    

    Felix



  • Geht das auch eleganter wenn es das Array z.B. einen größeren Index hat oder eine Konstante als Größe eingesetzt wird?



  • memset(zrg_arr, 0, 10*sizeof(int));
    

    füllt das Array mit 0-Bytes


  • Mod

    crashterpiece schrieb:

    memset(zrg_arr, 0, 10*sizeof(int));
    

    füllt das Array mit 0-Bytes

    furchtbar. falsch. undefiniert.

    Wenn du Initialisierung mit 0 willst, ist nichts weiter zu tun:

    int *test::zrg_arr[10];
    

    Das Array wird ohnehin statisch zero-initialisiert.

    Ein bißchen expliziter - und daher imo besser - ist ein expliziter Initialisierer:

    int *test::zrg_arr[10] = {};
    

    Das drückt aus, dass wir die Initialisierung nicht einfach vergessen haben - aber die Initialisierung mit 0 das richtige ist.

    Eine Initialisierung mit etwas anderem als 0 kann nur über die erwähnte Initialisierungsliste erfolgen - oder man benutzt eine Funktion, um nur die Elemente, die von 0 verschieden sein sollen, zu ändern (das ist technisch gesehen allerdings keine Initialisierung).



  • camper schrieb:

    crashterpiece schrieb:

    memset(zrg_arr, 0, 10*sizeof(int));
    

    füllt das Array mit 0-Bytes

    furchtbar. falsch. undefiniert.

    meinst du mit 'undefiniert' das fehlende '*'?

    memset(zrg_arr, 0, 10*sizeof(int*));
    

    furchtbar, aber nicht undefiniert. oder?


  • Mod

    lemurenkönig schrieb:

    camper schrieb:

    crashterpiece schrieb:

    memset(zrg_arr, 0, 10*sizeof(int));
    

    füllt das Array mit 0-Bytes

    furchtbar. falsch. undefiniert.

    meinst du mit 'undefiniert' das fehlende '*'?

    memset(zrg_arr, 0, 10*sizeof(int*));
    

    furchtbar, aber nicht undefiniert. oder?

    undefiniert deshalb, weil die Repräsentation 0-pointer nicht zwingend aus 0-Bytes besteht. Falsch wegen dem fehlenden *. Furchtbar, weil solche size-Ausdrücke sich wo immer möglich auf das Objekt und nicht auf den Typen beziehen sollten - das ist sonst so etwas ähnliches wie eine magische Konstante; es muss immer mit der Variablendeklaration geändert werden. Also (ignorieren wir das im Standard undefinierte):

    memset(zrg_arr,0,sizeof zrg_arr);
    

    und schließlich gibt es dafür Algorithmen:

    fill_n(zarg_arr,sizeof zarg_arr/sizeof *zarg_arr,0);
    

    das ist dann nicht undefiniert.



  • ok, ein array aus zeigern würde ich so nicht initialisieren, da gehe ich lieber den weg über eine schleife

    aber bei einem reinen integer-feld mach ich das grundsätzlich so :p


Anmelden zum Antworten