Почему на каждой платформе С++ существует другой класс строк?
Пока мне нравится программирование на С++, я ненавижу идею:
std::basic_string
vs
QString
vs
wxString
vs .............
Разве класс standard string
не удовлетворяет потребностям этих фреймворков? Я имею в виду, что не так с классом standard string
?!
Чтобы подчеркнуть, что ниже важен важный вопрос:
Вы изучаете "строковый класс рамки" во всех рамках, с которыми вы собираетесь работать? вместо этого вы бы придерживались стандартного строкового класса, пытаясь адаптировать его повсюду?
Спасибо...
Ответы
Ответ 1
Причина для нескольких классов строк заключается в том, что стандарт С++ был завершен довольно поздно (в 1998 году); это заняло некоторое время, пока все системы не предоставили правильную библиотеку С++. К тому времени все эти конкурирующие классы строк, которые уже написаны.
Кроме того, в некоторых случаях люди хотят наследовать от одного базового класса, который std::string не будет делать.
Ответ 2
IMO, std::string недостаточно стар, чтобы быть широко распространенным (Qt и wxWidgets старше STL или, по крайней мере, более старые, чем широко доступные стабильные и рабочие STL). Кроме того, std::string, к сожалению, не лучший класс строк для всех, а другие фреймворки имеют другие потребности.
Примечание! Параграф ниже немного некорректен, но он сохраняет смысл комментариев.
Например, С++ STL очень ограничен ресурсом, тогда как класс строк Qt предлагает множество полезных свойств, о которых коммит никогда не согласится, тем более, что некоторые хотят, чтобы он был легко реализован на встроенных системах и т.п.
Ответ 3
Одной из основных проблем с std::string
является отсутствие поддержки Unicode. Даже с std::wstring
вы получаете только контейнер для кодов Unicode, но все равно придется реализовывать функциональные возможности Unicode.
Кроме того, QString
например, "неявно разделяется". Это позволяет очень легко передавать строки вокруг вашего кода эффективным способом. Они фактически копируются только при записи.
Ответ 4
Одна разумная причина (по сравнению с необоснованными причинами, такими как "Я не хочу изучать стандартную библиотеку" ), заключается в том, что некоторые библиотеки хотят сохранить контроль над двоичным макетом, чтобы достичь определенных видов взаимодействия (таких как двоичная совместимость в разных версиях). Примером этого является _bstr_t в библиотеках VС++; для целей COM важно, чтобы _bstr_t был представлен как BSTR (поскольку это то, что требуется COM), поэтому оболочка, построенная поверх BSTR, является ценной для разработчиков COM.
Ответ 5
IIRC Bjarne Stroustrup сознательно пропустил класс String из С++, поскольку он считал это "обрядом прохода". Все те, кто изучил С++, должны были написать свои собственные. Конечно, в начале С++ не было стандартных библиотек, и я помню версии из AT & T (который был препроцессором для C) и классов NIH из очень новаторской группы в Национальных институтах здравоохранения в США (которая также включала ранние классы коллекции).
Ответ 6
std::string отлично... О, за исключением того, что у него нет вызова "Format()"... И у него нет Split() или Join()... Собственно, это не делает много вещей, которые пользователи строк на этих "уступающих" скриптовых языках получают как должное...
Если С++ имел возможность добавлять ADD к существующим классам (например, Objective-C или Ruby), вы, вероятно, не увидели бы это...
Также подумайте, что С++ обычно делает лучшую работу (чем такие, как Java), позволяя создавать объекты, которые ведут себя как реальные родные типы...
Ответ 7
Один из арендаторов С++: "Вы не платите за то, что вам не нужно". Это означает, что не обязательно быть строковым классом одного размера, который каждый программист на С++ должен знать и (что более важно) должен ИСПОЛЬЗОВАТЬ. Возможно, для вашего проекта требуются потокобезопасные строки. Вы можете бросить свой собственный класс. И у вас всегда есть возможность использовать существующий std::string.
Так получилось, что в большинстве случаев std::string достаточно хорош. Но когда это не так, разве вы не рады, что вы не заперты в нем. Попробуйте перевернуть собственный класс String на Java и посмотреть, сколько времени потребуется, пока вы не вытащите свои волосы.
Что касается вашего второго пункта, если вы собираетесь бороться с библиотекой, добавленной в ваш проект, почему вы добавили библиотеку в свой проект в первую очередь? Часть решения использовать wxWidgets или QT является подтверждением того, что вы должны принять свой класс строк в своем проекте (или, по крайней мере, значительную часть этого проекта). Точно так же, как решение библиотеки "C" означает использование буферов и параметров размера char * для всех функций.
Итак, да, изучите альтернативный класс строк. Если вы используете библиотеку (и хотите овладеть ею), вы не можете игнорировать часть библиотеки только потому, что "это еще один класс строки". Это не имеет смысла.