2016-03-04 5 views
0

Я создал a Date тип, у которого было 3 члена int day_, month_ и year_. я перегружен operator<< для Date и я не знаю, что это лучший выбор: у меня есть функция настоящее время драйвер называется ostream& showDate(ostream& os) определяется следующим образом:Параметры перегрузки оператора C++

std::ostream& Date::showDate(std::ostream& os) const { 

    return os << day_ << '/' << month_ << '/' << year_ << std::endl; 
} 

operator<< называют его:

std::ostream& operator<<(std::ostream& os, const Date& d) { 

    return d.showDate(os); 
} 

Но есть и другой вариант:

std::ostream& operator<<(std::ostream& os, const Date& d) { 

    return os << d.getDay() << '/' << d.getMonth() << '/' << d.getYear() << std::endl; 
} 

Какой у вас лучший выбор?

+1

Этот вопрос основан на мнениях, поскольку обе реализации функционально идентичны. –

+3

гул ... оба для меня приемлемы, кроме 'std :: endl'. 'operator <<' не должен принимать решение о возврате строки (и флеша) – Garf365

+1

Единственное, что я могу сказать, это то, что для избыточного кода будет _both_ 'метод showDate()' и ваш второй 'operator << () 'реализация. – mindriot

ответ

0

Ответы на это действительно будут основаны на мнениях. Технически, с любыми параметрами есть несколько преимуществ, поскольку они функционально эквивалентны (при условии разумной реализации аксессуаров, соответствующего контроля доступа и т. Д.).

Из трех функционально эквивалентных вариантов, которые вы указали, я склоняюсь к первому или третьему, так как обычно вам не нужно будет использовать функцию-член showDate() любой другой функцией, кроме operator<<().

Что касается выбора между первым и третьим, это действительно зависит от того, имеет ли смысл для operator<<() прямой доступ к элементам данных класса. Если члены public, возможно, нет причин предпочитать друг друга. Если они private, тогда выбор будет определяться тем, имеет ли смысл в вашем дизайне, что operator<<() будет friend (т. Е. Частью интерфейса класса).

В сторону: я бы не стал передавать std::endl в пределах вашего operator<<(). Пусть пользователь вашего класса решит, подходит ли новая строка и флеш.

2

Второй вариант - наиболее распространенный способ сделать это, и, следовательно, вероятно, наиболее читаемый (соответствует общей схеме).

Он также имеет то преимущество, что класс Date не должен ничего знать о потоках. Функция-член showDate вводит связь между двумя классами, которые в остальном независимы.