Компилятор не распознает функцию друга - PullRequest
1 голос
/ 05 июля 2019

Функция друга не может быть распознана

#include <iostream>
#include <cmath>

class hello {
    private:
        int a, b;
public: 
    hello(int a, int b) {
        this->a = a;
        this->b = b;
    }
friend int add();
};

int add() {
return a + b;
}

int main() {
hello number(1, 2);
std::cout << number.add();
}

Ожидается: необходимо добавить 2 переменные-члена класса hello (с функцией друга!)

Фактический результат: другфункция «add» не распознается как член класса

(сообщение об ошибке: ошибка: «класс hello» не имеет члена с именем «add»)

a и b в add () arenтоже не узнал.(Очевидно,)

1 Ответ

6 голосов
/ 05 июля 2019

Это не так, как работают функции друзей.Дружественная функция - это обычная функция (не функция-член), которая означает, что она не связана с конкретным экземпляром объекта.Единственная разница между ней и функцией не-друга заключается в том, что друзьям разрешен доступ к закрытым членам класса, с которыми они дружат.

Если вы хотите иметь возможность доступа к членам конкретного экземпляра объекта,Вы должны либо использовать функцию-член вместо функции друга:

class hello {
    int a, b;
public:
    int add() { return a + b; }
}

, либо взять экземпляр объекта в качестве параметра в функции друга:

int add(const hello& instance) {
    return instance.a + instance.b;
}
...