gpt4 book ai didi

C++ 使用 toString() 方法有什么问题

转载 作者:可可西里 更新时间:2023-11-01 18:25:23 25 4
gpt4 key购买 nike

我刚刚遇到 this question这是关于如何能够通过

std::cout << x << std::endl;

据我了解,实现此目的的标准方法是重载 ostreams << 运算符。但是,这是向 ostream 而不是我的类(class)添加了一个功能。

备选方案(也作为上述问题的答案给出)是覆盖字符串转换运算符。然而,这伴随着导致“意外转换和难以追踪的错误”的警告。

现在我想知道编写一个 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()方法确实如此。


其他人已经指出了这一点,但我认为更清晰的说法是您的类接口(interface)不仅限于它提供的方法,还包括您围绕它构建的其他函数,包括非成员函数,例如作为 operator<<你提供的重载。即使它不是您类的方法,您仍应将其视为类接口(interface)的一部分。

这是一篇讨论此问题的文章,也许您会发现它有帮助:How Non-Member Functions Improve Encapsulation


这是一个重载 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';
}

关于C++ 使用 toString() 方法有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27269423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com