2012-11-01 3 views
0

Je voudrais surcharger l'opérateur * pour la multiplication matricielle-vectorielle. Voici mes classes Vector et Matrix:C++ :: opérateur de surcharge * pour la multiplication matricielle - vectorielle

class Vec2 
{ 
    public: 
    Vec2(){} 
    Vec2(const RealNumber& a, const RealNumber& b) 
    { 
     a_ = a; b_ = b; 
    } 

    Vec2& operator = (const Vec2& B) 
    { 
     a_ = B.a_; 
     b_ = B.b_; 
     return(*this); 
    } 

    void a(const RealNumber& a){ 
     a_ = a; 
    } 

    void b(const RealNumber& b){ 
     b_ = b; 
    } 

    const RealNumber a(void){ 
     return(a_); 
    } 

    const RealNumber b(void){ 
     return(b_); 
    } 

    private: 
    RealNumber a_,b_; 
}; 

et classe de matrice:

class Mat2x2 
{ 
    public: 
    Mat2x2(){} 
    Mat2x2(const RealNumber& a, 
      const RealNumber& b, 
      const RealNumber& c, 
      const RealNumber& d) 
    { 
     a_ = a; b_ = b; c_ = c; d_ = d; 
    } 

    Mat2x2& operator = (const Mat2x2& B) 
    { 
     a_ = B.a_; 
     b_ = B.b_; 
     c_ = B.c_; 
     d_ = B.d_; 
     return(*this); 
    } 

    const RealNumber a(void){ 
     return(a_); 
    } 

    const RealNumber b(void){ 
     return(b_); 
    } 

    const RealNumber c(void){ 
     return(c_); 
    } 

    const RealNumber d(void){ 
     return(d_); 
    } 
    // compile time problem with this overloading function 
    const Vec2 operator * (const Vec2& B) const { 
     Vec2 result; 
     result.a(this->a_*B.a()+this->b_*B.b()); 
     result.b(this->c_*B.a()+this->d_*B.b()); 
     return result; 
    }  

    private: 
    RealNumber a_,b_,c_,d_; 
}; 

compiler le code avec g++ et obtenir l'erreur suivante:

error: passing ‘const rln::Vec2’ as ‘this’ argument of ‘const rln::RealNumber rln::Vec2::a()’ discards qualifiers [-fpermissive]

je ne peux pas comment résoudre le problème.

+1

Vous devriez en apprendre davantage sur les listes d'initialisation de constructeur. –

Répondre

3

Faites vos fonctions accesseurs const, comme ceci:

RealNumber a() const { return a_; } 
//    ^^^^^ 

(Soit dit en passant, il n'y a pas besoin de faire la valeur de retour const, en fait, c'est un modèle dépréciée en C++ 11 Il suffit de garder les choses simples.

+0

Merci! Il a résolu le problème. Au fait! Si j'omets 'const' de la valeur de retour (la valeur de retour est aussi une autre classe non intégrée) alors l'affectation de' lvalue' serait légale, non? – Rasoul

+0

@Rasoul: Je ne suis pas sûr si nous sommes d'accord sur ce que l'on entend par "affectation de lvalue", mais en effet, il y a un petit nombre de constructions qu'une valeur de retour const interdit. Je n'ai jamais vu une situation où cela aurait aidé quelqu'un ou empêché une catastrophe majeure. –