Оператор print_flower не видит приватные поля класса Flowers

#include <iostream>
class Flowers;
class Name {
public:
    void read_name() {
        std::cin >> name;
    }
    void print_name() {
        std:: cout << name << std::endl;
    }
    void print_flower(Flowers flower);
private:
    char name[30];
};
class Flowers {
public:
    Flowers() {
        a = 0;
        h = 0;
    }
    Flowers(int a, int h) {
        if (a < 0)
        {
            std::cout << "Некорректные значение, будет использовано значение по умолчанию" << std::endl;
        }
        else
        {
            this->a = a;
        }
        if (h < 0)
        {
            std::cout << "Некорректные значение, будет использовано значение по умолчанию" << std::endl;
        }
        else
        {
            this->h = h;
        }
    }    
    int get_a()
    {
        return a;
    }

    int get_h()
    {
        return h;
    }

    void set_a(int a)
    {
        if (a < 0)
        {
            std::cout << "Некорректные значение, будет использовано значение по умолчанию" << std::endl;
        }
        else
        {
            this->a = a;
        }
    }

    void set_h(int h)
    {
        if (h < 0)
        {
            std::cout << "Некорректные значение, будет использовано значение по умолчанию" << std::endl;
        }
        else
        {
            this->h = h;
        }
    }
    friend bool operator == (Flowers& lv, Flowers& fw);
private:
    int a, h;       //a = age, h = height
};
bool operator == (Flowers& lv, Flowers& fw)
{
    if (lv.a == fw.a && lv.h == fw.h)
    {
        return false;
    }
    return true;
}
std::ostream& operator << (std::ostream& out, Flowers& flower)
{
    return out << "Возраст: " << flower.get_a() << " Рост:" << flower.get_h();
}

std::istream& operator >> (std::istream& in, Flowers& flower)
{
    int a, h;
    std::cout << "Введите значение возраста: ";
    in >> a;
    if (a < 0)
    {
        std::cout << "Некорректные значение, будет использовано значение по умолчанию" << std::endl;
        flower.set_a(0);
    }
    else
    {
        flower.set_a(a);
    }

    std::cout << "Введите значение роста: ";
    in >> h;
    if (h < 0)
    {
        std::cout << "Некорректные значение, будет использовано значение по умолчанию" << std::endl;
        flower.set_h(0);
    }
    else
    {
        flower.set_h(h);
    }
    return in;
}
int Flowers::get_a() {
    return a;
}
int Flowers::get_h() {
    return h;
}

void Name::print_flower(Flowers flower) {
    std::cout << name << flower.a << flower.h << std::endl;
}
int main() {
    setlocale(LC_ALL, "rus");
        Flowers myFlowers;
        Name myName;
        myName.read_name();
        myName.print_flower(myFlowers);
        std::cout << myFlowers << std::endl;
        return 0;
}

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

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

Не "не видит", а "не имеет права к нему обратиться". Да и не оператор, а функция-член...

У вас зачем-то целых два раза реализованы get_a() и get_h() - так почему бы не воспользоваться ими хотя бы раз:

std::cout << name << flower.get_a() << flower.get_h() << std::endl;

Это решит эту вашу проблему. Вторую - с двойной реализацией - думаю, вы решите сами?

И, кстати, лучше передавать по ссылке, не создавая копию. Сказал бы "по константной ссылке", но, похоже, вы с const не дружите...

→ Ссылка