Как исправить ошибку допуска к переменной класса?

Доброго времени суток товарищи, подскажите пожалуйста, почему в friendly функции оператора "<<" выдаёт ошибку допуска?

//Header.h
class Complex {
private: double a, bi, f, r;//z = a+bi, f-угол, r-модуль числа

public:
    Complex();
    Complex(double a, double bi);
    ~Complex();

    friend ostream& operator <<(ostream &os, Complex &v);
    friend istream& operator >>(istream &is, Complex &vv);

    Complex operator +(const Complex& l);
    Complex operator -(const Complex& l);
    Complex operator *(const Complex& l);
    Complex operator /(const Complex& l);

    void SetCel(double a);
    double GetCel();

    void SetMni(double b);
    double GetMni();

};

Complex :: ~Complex() {};

Complex::Complex() {
    double a = 0;
    double bi = 0;
    double f = 0;
    double r = 0;
};
Complex::Complex(double a, double bi) {
    double a = a; 
    double bi = bi;
    double f = 0;
    double r = 0;
}

void Complex::SetCel(double a) {
    cout << "Введите первое комплексное число, сначала целую часть\n";
    cin >> a ; 
}
double Complex::GetCel() {
    return a;
}

void Complex::SetMni(double b) {
    cout << "Теперь мнимую часть(без i)\n";
    cin >> bi;
}
double Complex::GetMni() {
    return bi;
}


ostream& operator <<(ostream& os, Complex& v) {
    cout << v.a << " + i(" << v.bi << ")\n";
    return cout;`
}

Complex operator +(const Complex& l) {
    Complex Z;
    Z.a = a + a.x;
    Z.bi = bi + l.bi;
    return Z;
}```

Ответы (2 шт):

Автор решения: Harry

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

class Complex {
private: double a, bi, f, r;//z = a+bi, f-угол, r-модуль числа

public:
    Complex();
    Complex(double a, double bi);
    ~Complex();

    friend ostream& operator <<(ostream &os, Complex &v);
    friend istream& operator >>(istream &is, Complex &vv);

    Complex operator +(const Complex& l);
    Complex operator -(const Complex& l);
    Complex operator *(const Complex& l);
    Complex operator /(const Complex& l);

    void SetCel();
    double GetCel();

    void SetMni();
    double GetMni();

};

Complex :: ~Complex() {};

Complex::Complex() {
    a = 0;
    bi = 0;
    f = 0;
    r = 0;
};
Complex::Complex(double a_, double bi_) {
    a = a_;
    bi = bi_;
    f = 0;
    r = 0;
}

void Complex::SetCel() {
    cout << "Введите первое комплексное число, сначала целую часть\n";
    cin >> a ; 
}
double Complex::GetCel() {
    return a;
}

void Complex::SetMni() {
    cout << "Теперь мнимую часть(без i)\n";
    cin >> bi;
}
double Complex::GetMni() {
    return bi;
}


ostream& operator <<(ostream& os, Complex& v) {
    os << v.a << " + i(" << v.bi << ")\n";
    return os;
}

Complex Complex::operator +(const Complex& l) {
    Complex Z;
    Z.a = a + l.a;
    Z.bi = bi + l.bi;
    return Z;
}
→ Ссылка
Автор решения: Тимур Досов

Может прикастовать: ostream& operator <<(ostream& os, Complex& v) { os << (double)v.a << " + i(" << (double)v.bi << ")\n"; return os; } ? а в операторе >> прикастовать ссылку: (double&)v.a и (double&)v.bi

→ Ссылка