我刚刚遇到这个问题这是关于如何能够通过打印对象
std::cout << x << std::endl;
据我了解,实现此目的的标准方法是重载 ostream
另一种方法(也作为上述问题的答案给出)是覆盖字符串转换运算符。然而,这伴随着导致“无意的转换和难以追踪的错误”的警告。
现在我想知道编写 toString() 方法然后通过以下方式使用它是否有任何缺点
std::cout << x.toString() << std::endl;
输出流处理输出格式以及输出。所以与你的toString()
方法客户端将无法像管理其他所有内容一样管理对象的格式:
// set specific formatting options for printing a value
std::cout << std::scientific << std::setprecision(10) << 10.0 << '\n'; // prints 1.0000000000e+01
// set formatting based on user's cultural conventions
std::cout.imbue(std::locale(""));
std::cout << 10000000 << '\n'; // depending on your system configuration may print "10,000,000"
也许您不介意允许任何格式,所以也许这并不重要。
另一个考虑因素是,输出到流并不要求整个字符串表示一次位于内存中,但是您的toString()
方法确实如此。
其他人已经指出了这一点,但我认为更清楚的说法是,您的类接口不仅限于它提供的方法,还包括您围绕它构建的其他函数,包括非成员函数,例如operator<<
您提供的重载。即使它不是类的方法,您仍然应该将其视为类接口的一部分。
这是一篇讨论此问题的文章,也许您会发现有帮助:非成员函数如何改进封装
这是一个简单的重载示例operator<<
对于用户定义的类:
#include <iostream>
struct MyClass {
int n;
};
std::ostream &operator<< (std::ostream &os, MyClass const &m) {
for (int i = 0; i < m.n; ++i) {
os << i << ' ';
}
return os;
}
int main() {
MyClass c = {1000000};
std::cout << c << '\n';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)