Перегрузка оператора <<, ОС получает строку - PullRequest
0 голосов
/ 03 июня 2019

поэтому у меня проблема с моим кодом, я хочу перегрузить operator <<, все функции находятся в абстрактном классе Employee, так что </p>

friend std::ostream &operator<<(std::ostream &os, const Employee &employee) {
    os<<employee.print();
    return os;
}

Это функция печати:

virtual const std::string& print() const {
   return "description: "+this->description+ " id: "+ std::to_string(this->getID()); }

Описание и идентификатор только переменной в классе Employee

И это просто не работает, и я получаю исключение E0317, я понимаю, как то, что print возвращает, это не строка. Также, если я изменю тип возврата на

std::basic_string<char, std::char_traits<char>, std::allocator<char>>

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

1 Ответ

5 голосов
/ 03 июня 2019

const std::string& print() const

Возвращает ссылку на временную строку, которая выходит из области видимости, как только она создается, и поэтому используемая вами ссылка вне функции недопустима.

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

const std::string print() const

Еще лучшим решением было бы также сбросить const на возвращаемое значение, поскольку внесение изменений в возвращенный std::string может не повлиять на объект Employee. Нет никаких оснований для пытаться ограничивать будущих пользователей функции print(), если они хотят std::move возвращенную строку или внести изменения в нее другими способами.

Итак, это была бы лучшая подпись:

std::string print() const

Как и подразумевается в комментарии beforelyknownas_463035818 , эта функция не имеет никакого отношения к печати. Он возвращает строковое представление объекта, поэтому to_string действительно будет более подходящим именем.

...