2012-08-26 2 views
1

У меня есть класс фракции следующим образом.Лучше ли перегружать оператор добавления как функцию, не являющуюся членом?

class Fraction 
{ 
    int num, den ; 

    public: 
    //member functions here 
} ; 

я прочитал в какой-то книге, я думаю, что "Эффективное использование C++, что лучше перегрузить оператор сложения, как, не функции члена. Приведенная здесь причина заключалась в том, что она допускает коммутативное дополнение. Это прототип моей перегруженной функции для оператора сложения.

Fraction operator + (const Fraction &obj, const int add_int) ; 

Здесь, когда я его называю, я должен сделать это так.

f1 + 2 ; 

Но это не сработает.

2 + f1 ; 

Для этого мне пришлось бы снова написать функцию и изменить порядок параметров в этом.

Я хочу знать, есть ли способ, с помощью которого я могу перегрузить функцию за один раз и выполнить коммутативное дополнение?

+1

У вас не может быть одной функции, которая будет поддерживать обе формы. Вам нужно будет обеспечить перегрузку автономных функций. 'Фракционный оператор + (const Fraction & obj, const int add_int);' и 'Fraction operator + (const int add_int, const Fraction &obj) ;' и это правильный путь для этого. –

+1

Есть ли неявное преобразование из 'int' до 'Fraction'? Если это так, это может быть сделано, если это не так. –

+0

Вы слегка ошибочно используете эффективный C++. Он фактически заявляет« Объявлять не-членные функции, когда преобразования типов должны применяться ко всем параметрам ». –

ответ

5

Вы можете, но только если ваш класс имеет неявный конструктор из типа вы хотите добавить, так это будет работать:

class Fraction 
{ 
    int num, den; 

public: 
    Fraction(int n) :num(n), den(1) {} 

    // member functions here 
}; 

Fraction operator+(Fraction lhs, Fraction rhs) { ... } 

int main() 
{ 
    Fraction f1(5); 
    f1 = f1 + 5; 
    f1 = 5 + f1; 
} 

Конечно, это позволяет использование, что вы не сделали на самом деле Вы хотели, что это возможность добавить два объекта Fraction.

Fraction f1(1), f2(2); 
Fraction f3 = f1 + f2 

Я не могу себе представить, что вы хотели бы запретить это.

+1

И не рекомендуется ... –

+0

Спасибо за это. У меня было добавлено два объекта, проблема была только в том, что я поставил под сомнение. –

2

ли эти вещи:

  • Определить конструктор Fraction(int) для того, чтобы неявное преобразование из int в Fraction.

  • Определить operator+=() как участник функция.

  • operator+() Затем определяют в терминахoperator+=() как:

    Fraction operator+(Fraction f1, Fraction const & f2) 
    { 
        f1 += f2; //call `operator+=` member function 
        return f1; 
    } 
    

    Обратите внимание, что f1 передается по значению. Поэтому вы можете добавить к нему f2 и вернуть его.

Для детального ответа, см мой ответ здесь на подобный вопрос:

+0

Хорошо. Но если я делаю неявное преобразование , почему мне приходится перегружать + = оператор? –

+0

@CodingMash: Потому что имеет смысл иметь это o verload. Если вы можете сделать 'f1 = f1 + f2;' то почему вы не можете делать 'f1 + = f2;' также? Они одно и то же, не так ли? Перейдите по ссылке, приведенной в моем ответе; это объясняет их все. – Nawaz

+0

Я получил это. Я хочу сказать, что только для f3 = f1 + f2, мне не нужно перегружать оператор + =? –

1

Нет нет синтаксический конструкт для этого, потому что + -оператором является по определению не коммутативный в C++. Это означает, что вам нужно определить вторую версию, однако разумно вызвать первую версию с измененными параметрами в реализации.

0

Вам нужно либо неявное преобразование или иной второе определение оператора, но это вполне возможно сделать второе определение многоразовым, так что ваш код будет выглядеть следующим образом:

class Fraction : public commutative<Fraction> 
{ 
    int num, den ; 

    friend Fraction operator+ (int add_int, Fraction obj); 
public: 
    //member functions here 
}; 
Fraction operator+ (int add_int, Fraction obj); 

Позвольте мне знать, если вы хотите образец код для шаблона класса commutative<T>.

+0

Спасибо ... У меня есть его templatized. –

 Смежные вопросы

  • Нет связанных вопросов^_^