2016-06-18 2 views
0

Итак, у меня есть простой класс:Перегрузка операторов за пределами класса

class complex{ 

private: 

    double a,b; 

public: 

    void setA(double a){ this->a=a; } 

    void setB(double b){ this->b=b; } 

    double getA(){ return a; } 
    double getB(){ return b; } 

    friend complex operator+(const complex&, const complex&); 
}; 

И у меня есть фактический перегруженный оператор здесь:

complex operator+(const complex& x, const complex& y){ 

    complex c; 
    c.a=x.a+y.a; 
    c.b=x.b+y.b; 
    return c; 
} 

Я должен был оператор перегружен за пределами функции , Чтобы иметь доступ к частным переменным (они также должны быть частными), я подружился с классом с помощью функции. Я не знаю, правильно ли это делается, но, по крайней мере, это работает. Я хочу, чтобы иметь возможность добавлять целое число для обоих членов. В основном():

complex a; 
a.setA(2); 
a.setB(3); 
a+5; 

Приведёт к тому, что a.a = 7 и a.b = 8. Такая перегрузка внутри класса довольно легко сделать (Опять же, не знаю, если это хорошее решение, если нет, пожалуйста, поправьте меня):

complex operator+(int x){ 

    this->a+=x; 
    this->b+=x; 
} 

Но я понятия не имею, как сделать это за пределами класса, потому что Я не могу использовать этот «указатель».

+0

Операторы, которые реализованы внутри класса, должны опустить параметр левого операнда и вместо этого использовать 'this'. Операторы, которые реализованы вне класса, должны иметь левый параметр операнда и не могут использовать 'this'. Однако ваш член класса 'operator +()' реализован неправильно, вы не должны изменять значения 'this', оператор возвращает новый объект, поэтому измените его. –

ответ

3

Обычный подход к этой проблеме состоит в том, чтобы иметь функции-члены, которые определяют рефлексивную версию арифметических операторов и свободных функций, которые определяют не рефлексивную версию, реализованную с рефлексивной версией. Других деклараций не требуется. Например:

class complex { 
public: 
    complex& operator+=(const complex& rhs) { 
     x += rhs.x; 
     y += rhs.y; 
     return *this; 
    } 
private: 
    double x, y; 
}; 

complex operator+(const complex& lhs, const complex& rhs) { 
    complex result = lhs; 
    result += rhs; 
    return result; 
} 

Имея a+5 изменение значения a является необычным, но если это на самом деле вы хотите в, сделать operator+(int) член. Однако пользователи обычно ожидают, что a+5 оставит a без изменений и что a += 5 изменит a.

+0

«hrs» - это опечатка? –

+0

@ard_evon - это проверка орфографии. Исправлена. Благодарю. –