operator[]



  • Hallo!

    Ich habe folgeden Code (vereinfacht):

    .h:

    class Vector{
    private:
    
      float val[2];
    
    public:
    
      Vector();
    
      Vector(const Vector& vec2);
    
      Vector(float x, float y);
    
      float& operator[](const int index);
    };
    

    .cpp:

    Vector::Vector(){
    
      this->val[0] = 0;
    
      this->val[1] = 0;
    
    }
    
    Vector::Vector(const Vector& vec2){
    
      this->val[0] = vec2[0];
    
      this->val[1] = vec2[1];
    
    }
    
    Vector::Vector(float x, float y){
    
      this->val[0] = x;
    
      this->val[1] = y;
    
    }
    
    float& Vector::operator[](int index){
    
      return val[index];
    
    }
    

    Der VC++ Compiler akzeptiert das. Der gcc gibt folgenden Error aus:

    "error: passing `const Vector' as `this'
    argument of `float& Vector::operator[](int)' discards
    qualifiers"

    Ich nehme an dass das was mit dem const zu tun hat, wo ja der VC++ nach meinen Erfahrungen prinzipiell etwas toleranter ist. Wie muss denn das Codefragment laut Standard lauten, so dass es der gcc auch versteht?

    Danke im Voraus!

    mfg



  • Randfrage: In welchem Zusammenhang wird der Operator aufgerufen?

    Womöglich benötigst du noch eine const-Version davon, um den Operator auch mit konstanten Vektoren und temporären Werten aufzurufen:

    float Vektor::operator[](int index) const
    { return val[i]; }
    


  • Der Operator [] wird im Copy-Konstruktor verwendet.

    mfg



  • Füge nen const, wie CStoll es hat, ein und dann passt es.



  • ChrisR schrieb:

    Der Operator [] wird im Copy-Konstruktor verwendet.

    OK, das hatte ich übersehen. Und dort findest du auch den Grund für die Fehlermeldung - 'vec2' ist konstant und der operator[] ist es nicht (könnte also den this-Vektor verändern).
    Btw, an der Stelle brauchst du doch gar nicht das öffentliche Interface von vec2 - wenn du dort die Aufrufe "vec2[..]" ersetzt durch "vec2.val[..]", klappt das auch.


Anmelden zum Antworten