Лучшие практики с 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&

Другие вопросы по тегам