переопределить перегрузку оператора в C ++? - PullRequest
2 голосов
/ 19 мая 2010

Привет, ребята

У меня есть вызов класса Complex

Я сделал перегрузку оператора вот так

Complex c = a + b; // where a and b are object of Complex class 

который в основном является оператором + (сложный и тот);

но я не знаю, как сказать, например

double c = a + 10; //where a is object of Complex class but 10 is integer / double  

Я определил, что приведение типов для двойного символа - получим, что моя IDE говорит, что слишком много операндов +, и почему-то жалуется, что не может «понять» +

это должно быть в этом формате, хотя double c = a + 10;

спасибо

сообщение об ошибке

Error: more than one operator "+" matches these operands: 
error C2666: 'Rational::operator +' : 3 overloads have similar conversions 

1> could be 'const Complex Complex::operator +(const Complex &)' 1> 
or 'double operator +(const Complex &,double)' 

компилятор не может выбрать на основе подписи? и да, я определил его вне класса, потому что у меня был один, определенный внутри класса, спасибо

Ответы [ 5 ]

4 голосов
/ 19 мая 2010
double operator+(const Complex &c, int x)
{
    //....
}
3 голосов
/ 19 мая 2010

Как насчет размещения в конструкторе вида:

 Complex(float _real) : m_Real( _real ), m_Imaginary(0){}

, так что любое значение, которое может быть приведено к float, может быть принято как Complex. Тогда вам не нужно создавать перегруженный оператор для всех типов типов. Достаточно того, что вы написали для Complex.

2 голосов
/ 19 мая 2010

Причина, по которой вы получаете неоднозначную ошибку перегрузки, состоит в том, что у вас есть operator+ варианты, которые могут добавить два Complex или Complex и double, но вы пытаетесь добавить Complex и int. Компилятор не может решить, лучше ли конвертировать int в Complex, чтобы использовать первое или в double и использовать второе.

Чтобы избежать этого, вам нужно либо определить перегруженный operator+ для всех возможных типов, которые вы можете добавить к Complex (int, float, long, unsigned ...) ИЛИ не перегружать operator+ в первое место - просто определите SINGLE operator+, который добавляет два Complex, и пусть преобразования типов разбираются со всеми остальными случаями.

1 голос
/ 19 мая 2010

Перегрузка operator+ для двойного операнда:

double Complex::operator+(double rhs)
0 голосов
/ 19 мая 2010

Если вы планируете это сделать, вы можете сделать следующее. Во-первых, мы определяем следующее (вне класса, так что допускается неявное преобразование как для первого, так и для второго операнда), НЕ определяем никакой другой оператор +, такой как operator + (Complex, double):

Complex operator+(const Complex& a, const Complex& b) {
  // ..
}

Одновременно определите неявный конструктор:

Complex(double a) : real(a), imag(0) {}

А затем определите оператор преобразования (как указывалось в разделе «Утилиты», это можно считать плохой практикой программирования, с этим я согласен; поэтому, если окончательное преобразование в double не требуется, пропустите это):

operator double() const { return real; }

Это автоматически будет поддерживать double c = a_complex + 10; и double c = 10 + a_complex;, число 10 будет неявно преобразовано в Complex с помощью неявного конструктора, а арифметика будет преобразована в operator+(const Complex&, const Complex&);, результат будет автоматически преобразован в удвоенное .

P.S. Вы также можете определить Complex& operator+=(const Complex& o) { /* .. */ } внутри класса и использовать это для реализации operator+ выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...