代码之家  ›  专栏  ›  技术社区  ›  Khaled Alshaya

为什么在每个C++平台上都有一个不同的字符串类?

  •  12
  • Khaled Alshaya  · 技术社区  · 16 年前

    虽然我喜欢C++编程,但我讨厌这样的想法:
    std::basic_string vs QString VS wxString vs .............
    难道不是 standard string 类满足这些框架的需求?我是说有什么问题 标准字符串 班级?!

    要强调的是,以下是重要的问题:
    您是否在要使用的每个框架中都学习了框架的“字符串”类?你会坚持使用标准的字符串类来尝试在任何地方对它进行调整吗?

    谢谢。。。

    7 回复  |  直到 10 年前
        1
  •  14
  •   Martin v. Löwis    16 年前

    多个字符串类的原因是C++标准在相当晚的时候才完成(1998);然后需要一些时间,直到所有的系统实际上提供了一个正确的C++库。到那时,所有这些相互竞争的字符串类都已经写入了。

    此外,在某些情况下,人们希望从单个基类继承,而std::string不会这样做。

        2
  •  8
  •   Macke    14 年前

    imo,std::string不够旧,无法广泛使用(qt和wxwidget比stl旧,或者至少比广泛使用的稳定和工作的stl旧)。另外,对于每个人来说,std::string并不是最好的字符串类,其他框架也有其他需求。

    注意! 下面的段落有点不正确,但要理解评论。

    例如,C++STL是非常资源受限的,而QT String类提供了许多SuntTebe永远不会同意的好处,尤其是一些人希望它在嵌入式系统等上容易实现。

        3
  •  7
  •   LukáÅ¡ Lalinský    16 年前

    主要问题之一 std::string 缺少Unicode支持。即使有 std::wstring 您只能获得一个Unicode代码点的容器,但仍然必须实现Unicode感知功能。

    也, QString 例如,“隐式共享”。这使得以有效的方式在代码周围传递字符串变得非常容易。它们实际上只在写时被复制。

        4
  •  5
  •   DrPizza    16 年前

    一个合理的原因(与“我不想学习标准库”等不合理的原因相比)是,一些库希望保留对二进制布局的控制,以便实现某些类型的互操作性(例如跨版本的二进制兼容性)。这方面的一个例子就是VC++库中的“bstr”,对于COM来说,将“bstr”表示为“bstr”(因为这是COM需要的),因此在“bstr”之上构建的包装对于COM开发人员来说是很有价值的。

        5
  •  2
  •   peter.murray.rust    16 年前

    Irc Bjarne Stroustrup故意省略了C++中的一个字符串类,因为他认为它是一个“通行仪式”。所有学习C++的人都希望自己编写。当然,在C++开始时,没有标准库,我记得AT&AMT(它是C的预处理器)和NIH课程,来自美国国立卫生研究院的一个非常先锋的小组(也包括早期的收集课程)。

        6
  •  2
  •   dicroce    16 年前

    字符串很好…哦,除了没有“format()”调用…而且,它没有split()或join()。实际上,在那些“低级”脚本语言的字符串用户看来,它并没有做很多事情…

    如果C++有能力添加到现有的类(如Objto-C或Ruby),那么你可能不会看到这个…

    此外,请考虑C++通常在创建像真实本地类型的对象时做得更好(比Java那样的事情)…

        7
  •  0
  •   jmucchiello    16 年前

    C++中的一个租户是“你不为你不需要的东西付费”,这意味着不需要是每个C++程序员都必须知道和(更重要的)必须使用的一刀切的字符串类。也许您的项目需要线程安全字符串。你可以上自己的课。您总是可以选择使用现有的std::string。

    在大多数情况下,std::string已经足够好了。但如果不是的话,你不高兴自己没有被锁在里面吗?试着用Java编写你自己的字符串类,看看花多长时间才能拔出你的头发。

    至于你的第二点,如果你要与一个你已经添加到你的项目中的库作斗争,为什么你首先要将这个库添加到你的项目中?决定使用wxwidgets或qt的一部分是确认您必须在项目中接受它的字符串类(或者至少是该项目的一个相当大的部分)。就像对“c”库的决定意味着要在所有函数上放置char*缓冲区和大小参数。

    所以,是的,学习备用字符串类。如果您正在使用一个库(并且希望精通它),您不能仅仅因为“它是另一个字符串类”而决定忽略该库的一部分。那没有道理。