C++::оператор перегрузки* для умножения матрицы на вектор

Я хотел бы перегрузить оператор * для умножения матрицы на вектор. Вот мои классы Vector и Matrix:

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_;
};

и матричный класс:

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_;
};

Я компилирую код с g++ и получаю следующую ошибку:

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

Я не могу понять, как решить проблему.


person Rasoul    schedule 01.11.2012    source источник
comment
Вы должны узнать о списках инициализаторов конструктора.   -  person Kerrek SB    schedule 02.11.2012


Ответы (1)


Сделайте свои функции доступа const, например:

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

(Кстати, нет необходимости делать возвращаемое значение const; на самом деле, это устаревший шаблон в C++11. Просто будьте проще.)

person Kerrek SB    schedule 01.11.2012
comment
Спасибо! Это решило проблему. Кстати! Если я опускаю const из возвращаемого значения (возвращаемое значение также является другим классом, не встроенным типом), то присваивание lvalue будет законным, не так ли? - person Rasoul; 02.11.2012
comment
@Rasoul: я не уверен, согласны ли мы с тем, что должно означать назначение lvalue, но действительно, есть небольшое количество конструкций, которые запрещает возвращаемое значение const. Однако я никогда не видел ситуации, когда это помогло бы кому-то или предотвратило крупную катастрофу. - person Kerrek SB; 02.11.2012