Лучшие практики с C++ ostream (tostring)
Каковы лучшие практики при перегрузке <<
оператор. В частности, как я могу различить открытие по указателю против объекта. Кошерно ли им выводить одну и ту же строку при подаче на <<
?
Например, рассмотрим следующий код, где оба Book
объекты были инициализированы
Book b1;
Book* b2;
// initialization stuff
// can both of these output the same representation of a book object?
cout << b1 << endl;
cout << b2 << endl;
2 ответа
Как я могу отличить Opearting на указателе против объекта.
Подписью operator<<
функция:
std::ostream& operator<<(std::ostream&, const Book&); // operates on object
std::ostream& operator<<(std::ostream&, const Book*); // operates on pointer
Кошерно для них, чтобы вывести одну и ту же строку?
Это разрешено, но не особо полезно. Очень редко можно увидеть, как реализуется вторая форма. Если вы испытываете желание реализовать вторую форму, осознайте, что она полностью избыточна. Например, если у вас есть Book* pBook
:
std::cout << *pBook << "\n";
Это напечатает объект, к которому pBook
очки довольно приятно.
Не перегружайте operator<<
для указателей наT
, Вместо этого перегрузка для T
сам (или, скорее, const T&
при необходимости) и разыменуйте указатель в вашем вызове operator<<
,
cout << *b2 << endl;
Перегрузка для указателя наT
будет просто создавать путаницу и, возможно, конфликты имен, и не будет необходимости в первую очередь, если вы перегрузите для const T&