Problem mit const



  • Hallo,

    ich habe eine Klasse, die etwa so aussieht:

    class foo {
    
            private:
                    unsigned char* arr;
                    int size;
            public:
                    foo(int);
                    int getSize() {return size;}
                    unsigned char* getArr() {return arr;}
    };
    

    In der main habe ich dann eine konstante Instanz der Klasse foo und möchte gerne eine Kopie des Arrays arr haben.

    int main() {
    
            const foo bar(16);
            unsigned char* data = bar.getArr(); //Fehler
    

    Hier kommt es zum Fehler. Mir ist zwar eigentlich klar, dass es an const liegt, da ich durch denn Zeiger data die Möglichkeit hätte, bar zu ändern. Daran liegt mir jedoch gar nicht und ich frage mich, wie ich dieses Problem lösen kann.

    Den Typ von "arr" kann ich nicht ändern!
    Danke im Voraus



  • z.B. so

    class foo {
    
            private:
                    unsigned char* arr;
                    int size;
            public:
                    foo(int);
                    int getSize() {return size;}
                    unsigned char* getArr() {return arr;}
                    unsigned const char* getArr() const {return arr;}
    };
    


  • Auf const-Objekte kann man nur Methoden aufrufen, die auch als const deklariert wurden, damit "sichergestellt ist", dass das Objekt durch den Methodenaufruf nicht doch verändert wird.
    Eventuell könnte das dein Problem lösen:

    class foo
    {
        // ...
    public:
        const unsigned char* getArr() const { return arr; }
    };
    


  • das muss const-concret sein



  • Stichwort: const-correctness

    Und zu

    konmstantgut schrieb:

    und möchte gerne eine Kopie des Arrays arr haben.

    Du erhältst mit deiner Funktion aber keine Kopie des Arrays, sondern einen Zeiger auf das Originalarray.
    Benutze besser std::vector<>!



  • Hey, vielen Dank für die schnellen Antworten. Das hilft mir schon einmal weiter, aber das Problem ist noch nicht gelöst. Ich möchte nämlich einen vector mit dem unsigned char Array arr initialisieren.

    int main() {
    
            const foo bar(16);
            const unsigned char* arr = bar.getArr(); //Fehler dank euch gelöst
            vector<unsigned char> dat(arr, arr+bar.getSize()); //derselbe Fehler
    

    Da anscheinend in den vector dat das Original reingelegt wird und keine Kopie, kommt es hier nun zum selben Fehler:

    error: passing ‘const foo’ as ‘this’ argument of ‘int foo::getSize()’ discards qualifiers [-fpermissive]

    Ich dachte, dass es genügen würde, dat const zu machen, doch irgendwie scheint das nur wenig Wirkung zu haben. Warum?

    @Th69: Ich würde auch lieber vector benutzen, doch kann ich die Deklaration nicht ändern, da dies Teil einer großen Klasse ist, die man sonst komplett umschreiben müsste.



  • Wieder: Hast du foo::getSize() als const deklariert?



  • lesen müsste man können. Es lag an der Funktion getSize(). Die muss natürlich auch const sein 🙂



  • Noch eine Frage. Wofür steht das zweite const in der Funktionsdeklaration? Das erste gibt an, dass etwas konstantes zurückgeliefert wird. Reicht das nicht schon aus?



  • konstantgut schrieb:

    Noch eine Frage. Wofür steht das zweite const in der Funktionsdeklaration? Das erste gibt an, dass etwas konstantes zurückgeliefert wird. Reicht das nicht schon aus?

    Nein, weil konstante Objekte nur konstante Funktionen aufrufen dürfen.



  • ...


Anmelden zum Antworten