自定义字符串类实现建议

Custom string class implementation advice?

本文关键字:实现 字符串 自定义      更新时间:2023-10-16

我正在编写自己的字符串类(只是为了好玩),但遇到了一些问题。我希望我的类能够处理ASCII和Unicode字符串。如果将const wchar_t*分配给我的类,则会设置Unicode的标志。如果指定const char*,则Unicode标志是而不是集。

此外,如果您尝试将Unicode字符附加到ASCII字符串,它将创建一个全新的Unicode字符串,或者重新分配缓冲区并将所有内容转换为Unicode(不确定我会选择哪一个)。

无论如何,关于我的问题:我想要一些类似std::string的c_str函数的东西。显然,我有两个不同的函数,一个返回const char*ASCII字符串,另一个返回const wchar_t*Unicode字符串。

假设我的字符串是ASCII。如果我调用ToAsciiString()函数,它只会返回一个指向字符串内部存储的指针,该指针不会也不应该手动释放,因为字符串dtor会自动释放。

但是,如果我想要Unicode的ASCII字符串,我可以调用ToUnicodeString()。但这就产生了一个问题:我需要分配一个新的缓冲区来将ASCII字符串转换为。如果我这样做,那么返回的指针将需要手动delete[]’ed,例如,这违背了std::string的c_str的简单性。

我不知道该怎么做。

我认为您应该能够在类中维护2个缓冲区。在某些情况下,您将只有一个表示,但如果需要两个表示,则必须同时分配两个表示。

这种方法将使类的使用变得简单。在我们的时代,我们有千兆字节的RAM。这意味着,除非您需要处理大量数据,否则这种方法听起来并不荒谬。

我希望我的类能够处理ASCII和Unicode字符串。

这完全是错误的。如果希望字符串包含ASCII或Unicode字符,解决方案很简单:存储UTF-8。

根据定义,如果UTF-8字符串不包含任何后ASCII字符,那么它就是ASCII。所以你的字符串是ASCII,除非有人添加了一个大于127的代码点。没有必要来回切换;您可以使用相同的字节数组来处理它们。

此外,您似乎遵循了常见的Windows概念,即wchar_t*表示"Unicode",char*表示"ASCII"。他们不是。Unicode是一个描述21位代码点的含义及其关联方式的标准。21比特码点可以被存储在各种编码中。您的"Unicode"可能意味着"UTF-16"。