Перегруженный оператор вывода C++

поэтому я кодирую домашнее задание на С++, и есть заключительная часть, где он хочет, чтобы мы заменили форматированный метод вывода (toString) перегруженным оператором вывода/вставки. Чтобы быть на 100% честным, я понятия не имею, что он имеет в виду. Я немного поискал и нашел примеры кодов с использованием перегруженного оператора вставки, но не могу найти, как включить его в свой код. Хотя я думаю, что я мог искать в неправильном месте. Моя toString выглядит следующим образом:

string Movie::toString() const {
    ostringstream oS;
    oS << "\n\n====================== Movie Information\n"
    << "\n             Movie Title:\t" << title << "  (" << releaseYear << ")"
    << "\n    US Rank & Box Office:\t" << usRank << "\t$" << usBoxOffice
    << "\nNon-US Rank & Box Office:\t" << nonUSRank << "\t$" << nonUSBoxOffice
    << "\n World Rank & Box Office:\t" << worldRank << "\t$" << worldBoxOffice
    << "\n";
    return oS.str();
}

Как я уже упоминал, я не уверен, что означает «перегружен», поэтому, если по какой-то причине вам недостаточно информации, чтобы напрямую помочь мне с проблемой, вы можете дать мне краткое описание того, что он может иметь в виду, заменив текущий вывод с перегруженным оператором вывода. Благодарю вас

edit: Это следующий вопрос, который у меня есть. https://stackoverflow.com/questions/14924621/c-overloaded-output-operator-cont< /а>


person Jason Schayer    schedule 17.02.2013    source источник
comment
Этот вопрос, опубликованный несколько минут назад, содержит пример того, на что вы ссылаетесь: stackoverflow.com/questions/14924007/   -  person Mat    schedule 17.02.2013
comment
Вы пытались найти перегрузку в Википедии?   -  person n. 1.8e9-where's-my-share m.    schedule 17.02.2013
comment
Я сделал на самом деле. Я надеялся на вторичное объяснение.   -  person Jason Schayer    schedule 17.02.2013
comment
возможный дубликат перегрузки оператора   -  person Lightness Races in Orbit    schedule 17.02.2013


Ответы (2)


Перегрузить функцию означает предоставить другие функции с тем же именем, но с другими типами параметров. Операторы также могут быть перегружены. У многих операторов есть соответствующая функция, которая может быть перегружена, называемая operator??, где ?? — это сам оператор. Например, если у вас есть два объекта x и y класса типа T, вы можете перегрузить operator+. Перегрузка оператора позволяет вам придать смысл использованию этого оператора с типом. Итак, теперь вы можете сделать x + y.

Оператор вставки потока — <<. Это то, что вы используете, когда делаете std::cin << "hello"; — оно вставляется в поток. Этот оператор также может быть перегружен, как было перегружено + выше. Функция, которую нужно перегрузить, называется operator<<.

Есть два способа перегрузить бинарный оператор, такой как << (бинарный, потому что он принимает два операнда, один слева и один справа, left << right). Один из них состоит в том, чтобы сделать его членом типа left и дать ему единственный параметр типа right. Другой — сделать ее функцией, не являющейся членом, с двумя параметрами, один из которых имеет тип left, а другой — тип right. Поскольку тип вашего left будет std::ostream, вы не можете изменить класс (поскольку он предусмотрен стандартом), поэтому вам придется выбрать второй вариант.

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

std::ostream& operator<<(std::ostream& os, const Movie& movie) {
  // Insert everything you want into `os`
  return os;
}

Теперь эта функция будет вызываться всякий раз, когда вы делаете << с std::ostream слева и Movie справа.

person Joseph Mansfield    schedule 17.02.2013
comment
Я понимаю, насколько сейчас перегружен оператор и как его можно использовать, но все еще не совсем уверен, почему вы его используете. Спасибо за ответ. Я буду изучать это больше. - person Jason Schayer; 17.02.2013
comment
Хотя у меня есть еще один вопрос, если вы готовы к этому. У меня также есть функция getMovie, в которой она выбирает фильм с помощью и index. Буду ли я перегружать функцию так же, как мы это делали с tostring. - person Jason Schayer; 17.02.2013
comment
@JasonSchayer Вы используете его, потому что хотите иметь возможность делать Movie m; std::cout << m;. Это распечатает содержимое фильма m в указанной вами форме. Точно так же, как выполнение std::cout << 10; распечатает int 10. Теперь вы можете распечатать Movie! - person Joseph Mansfield; 17.02.2013
comment
@JasonSchayer Если ваш новый вопрос для уточнения, задайте его здесь, конечно. Если он отдельный, опубликуйте новый вопрос на SO. - person Joseph Mansfield; 17.02.2013
comment
Я опубликую это в другом SO, чтобы упростить задачу, и свяжу это здесь. - person Jason Schayer; 17.02.2013

Я думаю, что ваша задача заключается в написании перегруженного operator <<, который позволяет вам записывать строковое представление вашего объекта в выходной поток:

std::ostream& operator <<(std::ostream& os, const Movie& movie) {
    os << "\n\n====================== Movie Information\n"
       << "\n             Movie Title:\t" << movie.title << "  (" << movie.releaseYear << ")"
       << "\n    US Rank & Box Office:\t" << movie.usRank << "\t$" << movie.usBoxOffice
       << "\nNon-US Rank & Box Office:\t" << movie.nonUSRank << "\t$" << movie.nonUSBoxOffice
       << "\n World Rank & Box Office:\t" << movie.worldRank << "\t$" << movie.worldBoxOffice
       << "\n";
    return os;
}

И вы используете этот оператор так же, как и встроенные типы:

Movie m;

// Do something with m

cout << m;      // Write m to the standard output
person buc    schedule 17.02.2013
comment
Спасибо, и вы, и sftrabbit очень помогли - person Jason Schayer; 17.02.2013