ist length() const correct?



  • Ich sage zwar nein weil es das objekt hinter dem zeiger verändert, aber ich möchte doch mal ganz gerne von euch wissen was ihr dazu meint.

    Ich finde das, auch wenn es vielleicht nur einmal in der lebenszeit des objekts aufgerufen wird ( da der string nicht veränderbar ist ), das length() const nicht const sein darf. Weil es den String intern verändert.

    Ich hätte auch gerne eine Erklärung warum es const correct ist oder warum nicht, denn mir persönlich fehlen die Argumente. Ich empfinde es einfach als falsch. Zwar compiliert der g++ das anstandslos wenn p ein pointer oder eine reference ist aber zurecht mault er wenn es ein objekt ist.

    Oder gilt Const correctness nur für Objekte?

    BR

    class nstring {
    public:
      std::size_t length() const;
      utf8_iterator begin() const;
      utf8_iterator end() const;
    private:
      class representation;
      representation *p;
    };
    
    class nstring::representation {
    public:
      representation() 
      : length(0){}
      std::size_t length;
    };
    
    std::size_t nstring::length() const {
      if (!p->length)
        for (utf8_iterator it = begin(); it != end(); ++it)
          ++p->length;
      return p->length;
    }
    


  • begin() und end() greifen auf hier fehlende member in representation zu.



  • evilissimo schrieb:

    std::size_t nstring::length() const {
    if (!p->length)
    for (utf8_iterator it = begin(); it != end(); ++it)
    ++p->length;
    return p->length;
    }

    weil *this hier const ist, ist auch jedes member const. also auch p.
    aber der konstante zeiger namens p zeigt nicht auf was konstantes.

    der compiler weiß nicht, daß das, wodrauf du zeigst, echt ein teil von deinem objekt ist. er denkt, das sei was wie eine globale variable oder ein objekt, dem du nachrichten schickst, wenn du lusrt hast. ein fremdes objekt.



  • in einer const methode werden alle member innerhalb dieser methode const, dh aus representation * p wird representation * const p, dh der zeiger ist konstant, nicht das objekt welches dahinter liegt.



  • Wenn dir das mit dem const zu suspekt ist, dann kannst du ja

    mutual representation *p;
    

    schreiben, um klarzumachen, daß die interne Repräsentation auch bei const-Methoden verändert werden kann (dem Compiler ist das aber egal, daran sieht man auch, daß die const-correctness nicht durchgängig in C++ eingebaut wurde).



  • Wie kommst du darauf, dass mutable dem Compiler egal ist?



  • Ich meinte, daß es für diesen Programmcode egal ist, ob er noch zusätzlich mutual schreibt, da es ja auch ohne läuft, aber generell sollte (bzw. muß) man mutual eben für alle Member setzen, welche in const-Methoden verändert werden.



  • Das mutable in der Deklaration bezieht sich aber dann auf den Zeiger, und der soll ja gar nicht verändert werden.


Anmelden zum Antworten