有一个打印语句的函数是一种糟糕的编程实践吗
Is it bad programming practice to have a function that prints statement?
我想知道,如果一个类的函数只将输出打印到屏幕上,这是否是一种糟糕的编程实践?
理解目的的简单示例:
学生类有常用的set和get方法,但它也有一个名为void PrintStudentDetails();
的函数
应该这样做吗:
cout << "Name: " << student.GetName() << endl;
cout << "Age: " << student.GetAge() << endl;
cout << "Gender: " << student.GetGender() << endl;
或者作为调用打印函数的对象,主要如下:
student.PrintStudentDetails();
请告诉我正确的编码方法。
短版本
重载插入运算符。
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
是一个新行AND一个流刷新,该流刷新可能非常昂贵。通常,只有当必须立即将信息推送到客户端或流的缓冲区已满时,才需要刷新。在大多数其他情况下,更喜欢使用'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
变量的轻松访问。
有关重载运算符的更多智慧,请阅读运算符重载的基本规则和习惯用法是什么?
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在C++编程中继续下一行的另一种方法是什么?
- 如何使用模板元编程在 C++17 中将一种类型转换为另一种类型
- 是c++模板元编程的一种函数编程形式
- 将C++结构写入文件并使用另一种编程语言读取文件
- 函数体内部的 typedef 是一种糟糕的编程实践吗?
- 是否有一种可编程的方法来估计CPU执行fp操作所需的时间
- 在类中广泛使用函数类型定义是一种糟糕的编程实践吗?