Это плохая практика программирования иметь функцию, которая печатает оператор? - PullRequest
0 голосов
/ 24 февраля 2020

Я хотел бы знать, если это плохая практика программирования иметь класс, который имеет функцию, которая печатает только вывод на экран?

Простой пример для понимания целей: В классе ученика есть обычные методы set и get, но также есть функция с именем void PrintStudentDetails();

Должна ли она быть выполнена в основном как таковая:

cout << "Name: " << student.GetName() << endl;

cout << "Age: " << student.GetAge() << endl;

cout << "Gender: " << student.GetGender() << endl;

Или как объект, вызывающий функцию печати в основном как таковой:

student.PrintStudentDetails();

Пожалуйста, сообщите мне о правильной практике кодирования.

1 Ответ

0 голосов
/ 24 февраля 2020

Короткая версия

Перегрузка оператора вставки .

TL; DR-версия

Хотя нет ничего вредного в функции, которая только пишет в cout, это гораздо полезнее и не сложнее написать функцию, которая может писать в любой ostream.

void Student::PrintStudentDetails(std::ostream & out) // pass in any out stream
{
    out << "Name: " << student.GetName() << '\n'
        << "Age: " << student.GetAge() << '\n'
        << "Gender: " << student.GetGender() << '\n';
}

Примечание: операторы вставки могут соединяться в цепочку.

Сторона примечание: std::endl - это новая строка И поток flu sh, и этот поток flu sh может быть очень дорогим. Как правило, вы хотите передать sh только тогда, когда вам нужно немедленно доставить sh информацию клиенту или буфер потока заполнен. В большинстве других случаев предпочитайте использовать от '\n' до endl.

Писать перегрузку <<, которая печатает ваш класс, будет лишь незначительно сложнее, чтобы вы могли anystream << myClassInstance;.

std::ostream & operator<<(std::ostream & out, // any outstream
                          const Student & student) // the object to print
{
    out << "Name: " << student.GetName() << '\n'
        << "Age: " << student.GetAge() << '\n'
        << "Gender: " << student.GetGender() << '\n';
    return out; // this is the magic that allows chaining
}

Теперь вы можете

cout << myStudent;

Примечание: оператор вставки часто реализуется как friend класса, чтобы обеспечить легкий доступ к private переменным.

Для получения дополнительной информации о перегрузке операторов прочитайте Каковы основные c правила и идиомы для перегрузки операторов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...