друг с классом, но не может получить доступ к частным пользователям - PullRequest
10 голосов
/ 17 июля 2010

Функции друзей должны иметь доступ к приватным членам класса, верно? Так что я тут не так сделал? Я включил свой .h файл с оператором << Я намереваюсь подружиться с классом. </p>

#include <iostream>

using namespace std;
class fun
{
private:
    int a;
    int b;
    int c;


public:
    fun(int a, int b);
    void my_swap();
    int a_func();
    void print();

    friend ostream& operator<<(ostream& out, const fun& fun);
};

ostream& operator<<(ostream& out, fun& fun)
{
    out << "a= " << fun.a << ", b= " << fun.b << std::endl;

    return out;
}

Ответы [ 3 ]

13 голосов
/ 17 июля 2010

Здесь ...

ostream& operator<<(ostream& out, fun& fun)
{
    out << "a= " << fun.a << ", b= " << fun.b << std::endl;

    return out;
}

вам нужно

ostream& operator<<(ostream& out, const fun& fun)
{
    out << "a= " << fun.a << ", b= " << fun.b << std::endl;

    return out;
}

(Я был укушен этим задом много раз; определение перегрузки вашего оператора не 'не вполне соответствует объявлению, поэтому считается, что это другая функция.)

5 голосов
/ 17 июля 2010

Подписи не совпадают.Ваша функция, не являющаяся членом, доставляет удовольствие и удовольствие, а объявленный друг - удовольствие и удовольствие.

0 голосов
/ 17 июля 2010

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

class fun
{
    //...

    friend ostream& operator<<(ostream& out, const fun& f)
    {
        out << "a= " << f.a << ", b= " << f.b << std::endl;
        return out;
    }
};

Недостатком является то, что каждый вызов operator<< является встроенным, что может привести к раздуванию кода.

(Также обратите внимание, что параметр нельзя вызвать fun, поскольку это имя уже обозначает тип.)

...