#c
Вопрос:
У меня есть занятие, и я хочу перегрузить lt;:
class Vector3 { int x; int y; int z; public: Vector3(int a, int b, int c) : x{a}, y{b}, z{c} {} Vector3 operator (const Vector3amp; v); friend std::ostreamamp; operatorlt;lt;(std::ostreamamp; ost, const Vector3amp; v); };
Но в основном я хочу иметь доступ к элементам данных, поэтому здесь я сделал это с помощью функции друга и просто определил функцию в другом файле:
std::ostreamamp; operatorlt;lt;(std::ostreamamp; ost, const Vector3amp; v) { return ost lt;lt; '(' lt;lt; v.x lt;lt; ',' lt;lt; v.y lt;lt; ',' lt;lt; v.z lt;lt; ')'; }
Но мой вопрос в том, как это происходит, когда я не использую функцию друга и просто объявляю функцию так:
std::ostreamamp; operatorlt;lt;(std::ostreamamp; ost);
Затем определите его в другом файле:
std::ostreamamp; Vector3::operatorlt;lt;(std::ostreamamp; ost) { return ost lt;lt; '(' lt;lt; x lt;lt; ',' lt;lt; y lt;lt; ',' lt;lt; z lt;lt; ')'; }
Когда я пытаюсь на самом деле использовать его
int main() { Vector3 u(2,4,3); std::cout lt;lt; u; }
Это просто говорит:
gt; no operator matches these operands operand types are: gt; std::ostream lt;lt; Vector3
Но если я это сделаю u.operatorlt;lt;(std::cout);
Значит, это работает? Но почему? Я думал, что std::cout lt;lt; u;
в основном это то же самое, что u.operatorlt;lt;(std::cout)
;
Комментарии:
1. Твое последнее предложение, ты все понял наоборот.
std::cout lt;lt; u
это на самом делеcout.operatorlt;lt;(u)
Ответ №1:
A a; B b; a lt;lt; b;
Компилятор ищет элемент operatorlt;lt;
A
здесь, т. е. Если A::operator(B constamp;)
он существует, приведенный выше код использует его, но B::operatorlt;lt;(Aamp;)
не рассматривается.
Для вашего кода это означает, что требуется оператор-член std::ostream::operatorlt;lt;(Vector3 constamp;)
, который вы не можете добавить, так std::ostream
как он определен в стандартной библиотеке. Ваш единственный выбор здесь-это бесплатная функция.
Комментарии:
1. Но компилятор также смотрит, есть ли операторlt; потому что это может быть функция-член или свободная функция, верно?
Ответ №2:
Порядок имеет значение. Указанная вами перегрузка определяет u lt;lt; cout
и не cout lt;lt; u
определяет .