Программирование на C и C++

Онлайн справочник программиста на C и C++

Перегрузка операторов извлечения

Для того, чтобы перегрузить оператор извлечения — экстрактор, используется тот же самый об­щий подход, что и для перегрузки операторов вставки — инсертеров. Например, следующий эк­страктор осуществляет ввод трехмерных координат. Обратим внимание, что он также осуществ­ляет подсказку пользователю.

// получение трехмерных значений - экстрактор
istream &operator>>(istream &stream, three_d &obj)
{
cout << "Enter X Y Z values, separating each with a space: " ;
stream >> obj.x >> obj.y >> obj.z;
return stream;
}

Экстрактор должен возвращать ссылку на объект типа istream. Первым параметром должна быть ссылка на объект типа istream. Вторым параметром служит ссылка на объект, принимаю­щий ввод. Поскольку это именно ссылка, то второй аргумент может быть модифицирован при вводе информации.

Общая форма экстрактора имеет вид:

istream &operator>> (istream &поток, тип_класса &объект)
// код экстрактора
return stream;
}

Следующая программа демонстрирует экстрактор для объекта типа three_d:

#include <iostream.h>
class three_d {
int x, y, z; // трехмерные координаты
public:
three_d(int a, int b, int c) { x=a; y=b; z=c; }
friend ostream &operator<<(ostream &stream, three_d obj );
friend istream &operator>>(istream &stream, three_d &obj);
};
// вывод координат X, Y, Z (оператор вставки для three_d)
ostream &operator<<(ostream &stream, three_d obj)
{
stream << obj.x << ", ";
stream << obj.y << ", ";
stream << obj.z << "\n";
return stream; // возврат потока
}
// получение трехмерных значений - экстрактор
istream &operator>>(istream &stream, three_d &obj)
{
cout << "Enter X Y Z values, separating each with a space: ";
stream >> obj.x >> obj.y >> obj.z;
return stream;
}
int main()
{
three_d a(1, 2, 3);
cout << a;
cin >> a;
cout << a;
return 0;
}

Подобно функциям вставки, функции извлечения не могут быть членами класса, на элементах которого они оперируют. Как показано в примере, они могут быть друзьями или просто незави­симыми функциями. За исключением того, что экстрактор должен возвращать ссылку на объект типа istream, внутри экстрактора можно делать все, что угодно. Однако для лучшей структуриза­ции программы и ее ясности лучше всего ограничить эти действия только операциями ввода.