Почему в каждой платформе C ++ есть разные строковые классы? - PullRequest
12 голосов
/ 24 октября 2009

Хотя мне нравится программировать на C ++, я ненавижу идею:
std::basic_string vs QString vs wxString vs .............
Разве класс standard string не удовлетворяет потребности в этих платформах? Я имею в виду, что не так с классом standard string?!

Просто чтобы подчеркнуть, что ниже важный вопрос:
Вы изучаете "строковый" класс фреймворка в каждом фреймворке, с которым собираетесь работать? Вы бы вместо этого придерживались стандартного строкового класса, пытаясь адаптировать его везде?

Спасибо ...

Ответы [ 7 ]

14 голосов
/ 24 октября 2009

Причиной использования нескольких строковых классов является то, что стандарт C ++ был доработан довольно поздно (в 1998 году); затем потребовалось некоторое время, пока все системы фактически не предоставили правильную библиотеку C ++. К тому времени все эти конкурирующие классы строк уже были записаны.

Кроме того, в некоторых случаях люди хотят наследовать от одного базового класса, чего не может сделать std :: string.

8 голосов
/ 24 октября 2009

IMO, std :: string не достаточно старый, чтобы быть широко распространенным (Qt и wxWidgets старше, чем STL, или, по крайней мере, старше, чем широко доступные стабильные и работающие STL). Кроме того, std :: string, к сожалению, не самый лучший класс string, доступный для всех, и другие фреймворки имеют другие потребности.

Примечание! Параграф ниже немного некорректен, но содержит комментарии, которые имеют смысл.

Например, C ++ STL очень ограничены в ресурсах, в то время как строковый класс Qt предлагает множество полезностей, с которыми коммит никогда не согласится, особенно потому, что некоторые хотят, чтобы его легко можно было реализовать во встроенных системах и тому подобное. 1008 *

7 голосов
/ 24 октября 2009

Одной из основных проблем с std::string является отсутствие поддержки Unicode. Даже с std::wstring вы получаете контейнер только для кодовых точек Unicode, но все равно придется реализовать функциональность с поддержкой Unicode.

Кроме того, QString, например, является «неявно общим». Это позволяет очень легко передавать строки вокруг вашего кода. Они на самом деле копируются только при записи.

5 голосов
/ 24 октября 2009

Одна разумная причина (в отличие от необоснованных причин, таких как «Я не хочу изучать стандартную библиотеку»), заключается в том, что некоторые библиотеки хотят сохранить контроль над двоичной компоновкой для достижения определенных видов взаимодействия (таких как двоичная совместимость). по всем версиям). Примером этого является _bstr_t в библиотеках VC ++; для целей COM важно, чтобы _bstr_t был представлен в виде BSTR (поскольку это то, что нужно COM), поэтому оболочка, построенная поверх BSTR, полезна для разработчиков COM.

2 голосов
/ 25 октября 2009

std :: string отлично ... О, за исключением того, что у него нет вызова "Format ()" ... И у него нет Split () или Join () ... На самом деле, он не делает многих вещей, которые пользователи строк на этом "низшем" языке сценариев принимают как должное ...

Если бы C ++ имел возможность ДОБАВИТЬ к существующим классам (например, Objective-C или Ruby), вы, вероятно, этого не увидите ...

Кроме того, учтите, что C ++ обычно лучше (чем такие вещи, как Java) позволяет создавать объекты, которые ведут себя как настоящие нативные типы ...

2 голосов
/ 24 октября 2009

IIRC Бьярн Страуструп намеренно пропустил класс String в C ++, так как считал его «обрядом прохождения». Все те, кто изучал C ++, должны были написать свои собственные. Конечно, в начале C ++ не было стандартных библиотек, и я помню версии от AT & T (который был препроцессором для C) и классов NIH от очень новаторской группы в Национальных институтах здравоохранения в США (которая также включала классы ранней коллекции ).

0 голосов
/ 24 октября 2009

Один из арендаторов C ++ - «Вы не платите за то, что вам не нужно». Это означает, что не обязательно должен быть универсальный строковый класс, который должен знать каждый программист C ++ и (что более важно) ИСПОЛЬЗОВАТЬ. Может быть, ваш проект требует потокобезопасных строк. Вы можете бросить свой собственный класс. И у вас всегда есть возможность использовать существующий std :: string.

Просто так получилось, что в большинстве случаев std :: string достаточно хорош. Но когда это не так, разве ты не рад, что ты не заперт в этом? Попробуйте развернуть свой собственный класс String на Java и посмотрите, сколько времени потребуется, пока вы не потянете за волосы.

Что касается вашего второго пункта, если вы собираетесь бороться с библиотекой, которую вы добавили в свой проект, почему вы вообще добавили библиотеку в свой проект? Частью решения использовать wxWidgets или QT является признание того, что вы должны включить его строковый класс в ваш проект (или, по крайней мере, значительную часть этого проекта). Точно так же, как решение о создании библиотеки "C" означает использование буферов char * и параметров размера для всех функций.

Итак, да, изучите класс альтернативной строки. Если вы используете библиотеку (и хотите стать опытным с ней), вы не можете игнорировать часть библиотеки только потому, что «это другой класс строки». Это не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...