【问题标题】:C++: Is it recommended to create your own String class?C++:是否建议创建自己的 String 类?
【发布时间】:2012-05-23 20:15:46
【问题描述】:

我正在阅读一本 C++ 教程,作者说大多数 C++ 编译器都包含一个 String 类库,但即使包含,也建议创建自己的 String 类。不幸的是,作者没有说明原因。有没有人不同意/同意,为什么?

我正在使用 Xcode,提供的 String 类对我来说似乎很好,但话说回来,我只使用了几个小时,所以我不知道它的局限性。

提前致谢。

【问题讨论】:

  • 绝不应该创建自己的 String 类,标准的就可以了。
  • std::string 还不够好吗?为享受而制作一个总是很有趣,但我不认为它是有益的。
  • 我认为这对于学习目的很重要
  • 你需要做两件事:1)烧掉这本书,2)得到一本好书:Stroustrup/Sutter/Meyers/et al
  • 使用 1994 年的 C++ 书籍就像使用 1920 年的有关驾驶的书籍,其中的一章是关于 Model T 抛锚时需要携带哪些工具和用品的章节。

标签: c++ string class


【解决方案1】:

在我看来你有一本旧书。

C++ 标准库包含 std::string 类,您应该使用它,而不是自己发明并修复已在广泛使用的库中遇到并修复的错误。

作为初学者,是的,您应该尝试实施自己的方法,因为它会教给您很多东西。只是不要在任何“真实”项目中使用它。

【讨论】:

  • 实际上,STL 并不包含 std::string。当 STL 被添加到标准库时,std::string 被破坏了很多以使其符合 STL 范式,但 STL 没有也没有包含一个。
  • @CrazyEddie:我一直认为他们是,但我不知道现实稍微复杂一些。我在这里找到了一个 SO 帖子:stackoverflow.com/questions/5972546/…
  • 虽然不完全是 std::string,但 STL 的某些发行版确实包含 bstring(基本字符串)。我记得,Alexander Stepanov 说这只是为了让一些简单的例子保持简单。
  • 编写一个字符串类作为 DLL 接口的包装器是有益的。 stackoverflow.com/questions/5661738/…
  • @Fabian:当然;任何需要标准 ABI 的东西都必须放弃 STL
【解决方案2】:

C++ 没有String 类。但是有一个 std::string 类,它涵盖了基本的字符串功能,并保证标准存在。要使用它,您需要#include <string>

如果您发现自己需要比std::string 提供的更多功能,您可以随时添加对字符串进行操作的免费函数。也有第三方字符串实现(MS 的CString,RogueWave 的RWCstring),但如果你只是做一些基本的事情,我个人认为它们不是很有用。

【讨论】:

    【解决方案3】:

    建议创建自己的String类

    我相信作者建议创建你自己的String 类,作为一个很好的编程练习来培养你的技能。

    暗示为实际生产代码或非学术代码创建自己的 String 类是荒谬的(至少可以说)

    【讨论】:

      【解决方案4】:

      标准库的std::string类缺少字符串类中常见的许多功能,包括拆分字符串、匹配正则表达式、转换为整数等。我认为完全重写std::string不是一个好主意类(除非它与您的需求根本不兼容),但是将 std::string 类子类化以提供其中一些功能会很好。

      【讨论】:

      • 只要确保你没有引入任何额外的字段。否则,如果您尝试 delete 指向指向子类实例的 std::string 指针,则会发生内存泄漏。
      • std::string 缺少这些功能,因为它们不属于字符串类的一部分。它们可以(并且正在)作为免费函数轻松实现。
      • 作为记录,您永远不应该通过继承来扩展 STL 容器类。它们旨在通过遏制(黑盒重用)进行扩展,如果您尝试其他方式,您可能会得到一些令人讨厌的惊喜。
      • 我知道我会因此而被否决,但其中有一些道理(子类化字符串除外!!)。要使用字符串创建健壮的编程环境,您必须编写自己的辅助函数,或者您必须使用 boost 辅助函数。
      • @luskan C++11 提供了一些非常有用的字符串功能以及正则表达式。
      【解决方案5】:

      出于某些原因,您可能想要创建自己的字符串类,例如,您可能想要创建一个不可变的字符串类,其函数针对创建新的派生字符串而不是修改现有字符串进行了优化,因为它们有时可以更好地处理大量多线程代码。但是,如果您正在阅读初学者书籍,这当然不是您需要做的事情,并且可能至少应该重新考虑三遍。

      正如人们所说,std::string 用于 99.9% 的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 2012-04-29
        • 1970-01-01
        • 2017-11-27
        相关资源
        最近更新 更多