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

2023-11-27

我刚刚遇到这个问题这是关于如何能够通过打印对象

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(使用前将#替换为@)

C++ 使用 toString() 方法有什么问题 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • HtmlAgilityPack 中的 NullReferenceException

    我正在尝试提取一个link using xpath从下面提到的网址 string url http www album cover art org search php q Ruin Live Album Version Lamb of G
  • 如何实现均衡器

    我知道 so 中有很多关于均衡器的问题 但我没有得到我想要的东西 我想做的是一个均衡器 用于以如下方式修改音频样本 equalizer eqAudio audiosamples band gain 我不确定这是否是我想要的确切接口 因为我对
  • 设计无密码更新用户

    我想在设备中更新没有密码的用户属性 这种情况就像 如果密码和密码确认字段不为空 那么我需要设计错误 如果它们为空 则需要更新其他用户属性 我怎样才能用 devise 做到这一点 提前致谢 我认为这是一个更好的解决方案 if params u
  • Qt 的 Visual Studio 集成工具有什么区别?

    Trolltech 发布了一款名为 Visual Studio 插件 表彰他们的 Qt LGPL 和 GPL 版本 他们声称商业版本附带了完整的 Visual Studio 集成工具 但我没有看到任何关于它们之间差异的描述 完整版中包含哪些
  • 客户端套接字 - 获取 IP - java

    我正在使用套接字实现 TCP 连接 我需要在服务器端获取客户端套接字的 IP 我已经用过socketName getRemoteSocketAddress 它确实返回了 IP 地址 后跟我正在使用的端口 ID 我怎样才能只获取地址而不获取端
  • 忽略其他类的 System.exit()

    鉴于下面的课程 public class ClassOne public static void main String args System exit 1 假设调用 ClassOne main 后还有其他事情要做 下面的类也将被销毁 p
  • 臃肿的 echo 命令

    看一下 echo 命令的以下实现 http bxr su o bin echo echo c 开放BSD http bxr su d bin echo echo c 蜻蜓 http bxr su n bin echo echo c 网络BS
  • 如何在 IIS 中添加服务器变量

    我对 IIS7 不太熟悉 我需要创建一个服务器变量 以便我可以在 PHP 代码中访问它 我可以在 Apache 中使用以下命令轻松完成此任务 SETENV 变量名 变量值 在 htaccess 文件中 然而 在 IIS 中实现这一点似乎有点
  • 如果没有促销价,如何显示 woocommerce 促销价或正常价格

    我正在使用 woocommerce 产品插件插件 我想在插件的下拉部分中显示产品的价格 目前我的代码是这样的 p class p
  • Exchange Powershell - 如何从内部脚本调用 Exchange 2010 模块?

    我正在编写一个脚本 该脚本可以使用 AD 和 Exchange 执行许多操作 并且刚刚到达 GUI 的部分 我需要在其中开始使用 Exchange 但看不到可以手动指定包含 Exchange 模块的位置 我熟悉的正常过程是导入模块活动目录
  • C# 在 Windows 中读取视频元数据(标题、描述、年份)

    大家好 只是想制作一个程序来浏览视频文件并从文件元数据中读取标题和描述 我找到了一些来自微软的文档here提供了所需的内容 但如何访问这些功能 C 中需要什么 using 命名空间 我希望能提供任何帮助 在您发布的链接中 滚动到底部并单击
  • 使用 Java 和 awt.Robot 时提高屏幕捕获速度

    编辑 如果有人还有任何其他关于提高屏幕捕获性能的建议 请随时分享 因为它可能完全解决我的问题 各位开发者大家好 我正在为自己开发一些基本的屏幕捕获软件 截至目前 我已经得到了一些概念证明 修补代码 它使用 java awt Robot 将屏
  • iPhone :UITableView CellAccessory 复选标记

    在 iPhone 应用程序中 单击表视图单元格我想显示表视图单元格附件类型在 didSelectRowAtIndexPath 上复选标记我正在编写代码 if indexPath row 0 tableView cellForRowAtInd
  • 同时最大运行Web Worker html5

    是否有可以同时运行的 Web Worker 的最大数量 多谢 是和不是 对于 Web Workers 没有硬性限制 但您会受到可用 CPU 和内存的限制 每个工作线程都会产生相当大的 CPU 和内存开销 因此如果您分拆大量工作线程 可能会导
  • java swing中的setvisible方法挂起系统

    我目前正在开发银行 gui 应用程序 我的 jdialog 的 setvisible 方法似乎有问题 用户提取有效金额后 我会弹出一个简单的对话框 显示 交易正在进行中 在我的 dobackground 方法中 我不断轮询以检查是否已收到交
  • 如何修复ConnectionRefusedError: [WinError 10061]目标机器主动拒绝呢? (Django 电子邮件)

    我正在使用 Django 发送电子邮件 我显然遇到了一个常见的网络错误 但我读过的任何答案都没有解决 我相信插座有问题 当我发送电子邮件时 出现以下错误 Traceback most recent call last File
  • Android ViewFlipper 动画

    我陷入了一个简单的问题 这让我发疯 基本上我有 2 个 ImageView 我试图让第一个显示一秒钟 然后淡出以显示第二个 我一直在研究使用 ViewFlipper 下面的示例代码 但动画不存在 ViewFlipper mFlipper n
  • 在 C++ 中包含 C 代码

    我试图将 C 代码包含到一个简单的 C 程序中 但遇到了一个意想不到的问题 当我尝试编译程序时 g 给出了以下错误 tmp cccYLHsB o In function main test1 cpp text 0x11 undefined
  • 如何将标记库作为域类中的函数进行调用

    我需要调用静态资源插件 http www grails org Static Resources Plugin 来自我的域类 这在控制器中完美运行 def tstLink resourceLinkTo dir docs identifier
  • C++ 使用 toString() 方法有什么问题

    我刚刚遇到这个问题这是关于如何能够通过打印对象 std cout lt lt x lt lt std endl 据我了解 实现此目的的标准方法是重载 ostream 另一种方法 也作为上述问题的答案给出 是覆盖字符串转换运算符 然而 这伴随