Перегрузка операторов и функции, не являющиеся членами Переполнение стека

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

Вот мой код .h:

class Complex
{
private:
double a;
double b;

public:
Complex();
Complex(double aGiven);
Complex(double aGiven, double bGiven);

double aGetValue();
double bGetValue();
double operator[](bool getB);

Complex add(Complex &secondRational);
Complex operator+(Complex &secondRational);
}

.каст:

Complex Complex::add(Complex &secondRational)
{
double c = secondRational.aGetValue();
double d = secondRational.bGetValue();
double anew = a+c;
double bnew = b+d;
return Complex(anew,bnew);
}

Complex Complex::operator+(Complex &secondRational)
{
return add(secondRational);
}

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

1

Решение

Вот оператор сложения вне класса:

Complex operator+(const Complex& lhs, const Complex& rhs) {
//implement the math to add the two
return Complex(lhs.aGetValue() + rhs.aGetValue(),
lhs.bGetValue() + rhs.bGetValue());
}

Конечно, вам нужно будет объявить aGetValue() а также bGetValue() как const:

double aGetValue() const {return a;}
double bGetValue() const {return b;}
1

Другие решения

Вы можете объявить друга своим Complex учебный класс

class Complex {

// blah....

friend Complex operator+(Complex const& a, Complex const & b);
};

Перегруженный оператор может получить доступ к приватным членам Комплекса.

0

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

class complex {
public:
const complex& operator+=(const complex& rhs) {
real += rhs.real;
imag += rhs.imag;
return *this;
}
};

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

Как объяснено выше pippin1289.

Почему объясняется ниже:

Представьте, что нужно использовать объект класса как

Complex c3 = 5 + c1;// for c3 object c1's real part (a) added with 5

В C ++ сохраняют порядок операндов. Компилятор разрешает вызов выше сложения как
5.оператор + (постоянный комплекс & другое); // что невозможно
Следовательно, перегрузите его через свободную функцию.

Ваш класс предоставляет необходимую информацию через открытый интерфейс, такой как aGetValue () и bGetValue.
Следовательно, эта бесплатная перегруженная + операторная функция не обязательно должна быть другом класса.

Кроме того, предпочитайте функции, не являющиеся друзьями, а не функции-членам, поскольку это помогает снизить степень инкапсуляции.
Это объясняется здесь ==> http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197?pgno=1

0
По вопросам рекламы [email protected]