Как перегрузить оператор *, когда мой объект находится на правой стороне в C ++? - PullRequest
2 голосов
/ 31 января 2011

Я хочу реализовать «оператор *», перегружающий ВНУТРИ моего класса, поэтому я мог бы сделать следующее:

Rational a(1, 2), b;
b = 0.5 * a; // b = 1/4

Обратите внимание, что b находится справа, есть ли способ сделатьтакая вещь внутри"Рациональный" класс?

Ответы [ 3 ]

7 голосов
/ 31 января 2011

Нет.Вы должны определить operator* как свободную функцию.Конечно, вы можете реализовать это в терминах функции-члена для второго аргумента.

5 голосов
/ 31 января 2011

Да:

class Rational {
  // ...
  friend Rational operator*(float lhs, Rational rhs) { rhs *= lhs; return rhs; }
};

Примечание: это, конечно, злоупотребление ключевым словом friend.Это должно быть свободной функцией.

0 голосов
/ 31 января 2011

Ответ: нет, вы не можете, но, поскольку значение с плавающей запятой находится слева, вы можете ожидать, что тип результата из «0.5 * a» будет двойным.В этом случае вы можете подумать о преобразовании оператора.Обратите внимание, что «pow (a, b)» добавлен только для иллюстрации идеи.

  1 #include <stdio.h>
  2 #include <math.h>
  3 
  4 class Complicated
  5 {
  6 public:
  7     Complicated(int a, int b) : m_a(a), m_b(b)
  8     {
  9     }   
 10      
 11     Complicated(double a) : m_a(a)
 12     {
 13     }
 14     
 15     template <typename T> operator T()
 16     {
 17         return (T)(pow(10, m_b) * m_a);
 18     }   
 19     
 20     void Print()
 21     {
 22         printf("(%f, %f)\n", m_a, m_b);
 23     }   
 24     
 25 private:
 26     double m_a;
 27     double m_b;
     28 };  
 29
 30 
 31 int main(int argc, char* argv[])
 32 {
 33     Complicated pr(1, 2);
 34     Complicated c = 5.1 * (double) pr;
 35     c.Print();
 36 }
 37 
...