Verständnissproblem mit *const in Klassendefinition



  • Ich habe mal eine Frage zur Definition von einem zweidimensionalen Array, bei dem das Array const sein soll. Die Definition eines einfachen Arrays ist mir klar, so hoffe ich jedenfalls. Wenn ich mich nicht irre, definiert die folgende Zeile ein konstantes Array, bei dem die Werte jedoch verändert werden können.

    int *const num_entries;
    

    Mit dem nachfolgenden Klassenkonstruktor mit Initialisierungsliste wird es initialisiert:

    AlgoOPTICS::AlgoOPTICS(int p, int epsilon, lmf_db *db) : num_entries(new int [num_rec]) {
       ...
    };
    

    Wie kann ich folgendes zweidimensionale Array initialisieren?

    float **const lBound;
    

    Ich habs jetzt so geschrieben,

    AlgoOPTICS::AlgoOPTICS(int p, int epsilon, lmf_db *db) : num_entries(new int[features]), lBound(new float* [num_rec]) {
       ...
       for(i=0; i<num_rec; i++) 
          lBound[i] = new float[features];
       ...
    }
    

    Hier wird nur die erste Dimension konstant gesetzt, oder?
    Wie kann ich die zweite Dimension konstant setzen?



  • Das ganze möchte ich machen, da dieser Algorithmus viele Daten als Input hat, ich hab nur mit dem Handling ein Problem. Wie werden z.b. const Zeiger wieder deinitialisiert? Kennt sich hier jemand aus.
    Oder gibt es einen anderen Ansatz, dass Adressen beim Berechnen nicht einfach vom Programm verändert werden, und ich zur Laufzeit Fehlermeldungen bekomme?



  • Mth@Bx schrieb:

    Oder gibt es einen anderen Ansatz, dass Adressen beim Berechnen nicht einfach vom Programm verändert werden

    Adressen, die in Zeigern gespeichert sind, werden von Programm überhaupt nicht verändert, solang du sie nicht veränderst.
    Muss es denn überhaupt ein const zeiger sein? Zweidimensionale Arrays kann man auch komplett mit einem new Aufruf erstellen:

    const size_t dim_1 = 10;
    const size_t dim_2 = 5;
    float* my_array = new float[dim_2 * dim_1];
    // my_array[5][2] = ...
    my_array[5 * dim_1 + 2] = ...;
    

    Das Handling ist zwar nicht schön, aber machbar.
    Imo sinnvoller ist es für sowas eine Kombination einer eindimensionalen Array Klasse zu verwenden, zB std::vector<std::vector<float> >. Oder noch besser (zwecks Speicherhandling), eine eigene Klasse zu schreiben. Wobei es mich nicht wundern würde, wenn man sowas nicht irgendwo im Netz auftreiben könnte. 😉


Anmelden zum Antworten