Почему ключевое слово Friend требуется при перегрузке оператора <<? - PullRequest
1 голос
/ 27 апреля 2019

В следующем примере все мои участники являются публичными, поэтому я не понимаю, почему мне все еще нужно добавить ключевое слово friend.Более того, этот метод относится к экземпляру Point, поэтому я также не понимаю, почему я должен ссылаться на свои атрибуты через const Point% p.При перегрузке + получен только иностранный экземпляр.

#include <iostream>

struct Point {
    int x, y;
    Point(int x, int y): x(x), y(y) {};
    Point operator+(const Point& other) const {
        return Point(x + other.x, x + other.y);
    }

    friend std::ostream& operator<<(std::ostream& os, const Point& p) {
        return os << "(" << p.x << "," << p.y << ")";
    }
};

int main() {
    Point p = Point(4,7) + Point(8,3);
    std::cout << p << std::endl;
}

Подобные вопросы, такие как one , не очень помогают в этом случае.

1 Ответ

3 голосов
/ 27 апреля 2019

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

#include <iostream>

struct Point {
    int x, y;
    Point(int x, int y): x(x), y(y) {};
    Point operator+(const Point& other) const {
        return Point(x + other.x, x + other.y);
    }

};

std::ostream& operator<<(std::ostream& os, const Point& p) {
    return os << "(" << p.x << "," << p.y << ")";
}

int main() {
    Point p = Point(4,7) + Point(8,3);
    std::cout << p << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...