Расширение QString для перегрузки конструкции - PullRequest
0 голосов
/ 26 сентября 2011

Я хотел бы расширить класс QString из Qt, чтобы обеспечить некоторое удобство для преобразования в / из различных типов строк.

Например, я хотел бы иметь возможность писать строки вроде:

MyStringClass myString(_T("Hello World!"));

и получите объект MyStringClass, который ведет себя так же, как QString. Используя только QString, это должно было бы быть написано как:

QString myString = QString::fromWCharArray(_T("Hello World!"));

Есть и другие функциональные возможности, которые я хотел бы добавить в MyStringClass, но я зацикливался на том, как перегружать конструктор, чтобы принимать параметр wchar_t, как в моем примере. Похоже, что внутренние данные QString являются частными, поэтому мой производный класс не может напрямую настроить объект по мере необходимости (насколько я могу судить).

1 Ответ

1 голос
/ 26 сентября 2011

Вы действительно не абстрагируете ничего, это плохая идея. Если вы кусаете пулю и исправляете ее сейчас, вам больше не придется с ней сталкиваться. Если вы продолжите откладывать, стоимость будет увеличиваться по мере вашего продвижения.

Вы действительно хотите, чтобы ваши основные типы были максимально простыми.

Использование 6 различных типов строк также невозможно, поэтому сузьте его до QString как можно скорее. Если вам нужна помощь в преобразовании типов, напишите некоторые функции адаптера. Для удобства я использовал простые вещи, подобные приведенным ниже, для преобразования между QString и std :: string.

std::string sstr(const QString &str);

QString qstr(const std::string &str);

Я уверен, что вы можете написать подобное для других упомянутых вами типов.

Если вы действительно хотите написать свой собственный класс, чтобы помочь с переходом, тогда вы должны защитить себя от его дальнейшего использования. Реальный риск заключается в том, что, несмотря на его предполагаемую амортизацию, он используется навсегда. Если вы разрешите ваш новый строковый класс в открытых интерфейсах, от него будет трудно избавиться. В этот момент это просто еще один строковый тип для обработки с другими.

class MyStringClass {
public:
  MyStringClass(const std::string &val);
  MyStringClass(const char *val);
  MyStringClass(const wchar_t *val);

  QString getQString() const;
};

Это дает простой способ получить то, что вам нужно в новом коде, и не допускает неявных преобразований. QString в любом случае является объектом-значением, но вы не уверены, что можете использовать его так, как хотите.

Скорее всего, вы не будете преобразовывать большую часть кода, но пока он находится в частной реализации, он не будет причинять вам боль так часто.

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