Russian Qt Forum

Qt => Общие вопросы => Тема начата: sindbad07 от Август 19, 2010, 08:37



Название: Как подружить оператор выбора switch и QString
Отправлено: sindbad07 от Август 19, 2010, 08:37
Здравствуйте, делаю так:

QString type;
..
switch( type )
{
case "type1":
..
break;
..
}

компилятор ругается: "error: switch quantity not an integer"
Подскажите как сделать свитч для строк. Спасибо.


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: BRE от Август 19, 2010, 08:57
switch может работать только с целыми типами.


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: Авварон от Август 19, 2010, 08:57
никак, в с++ это ограничение свитча (он сравнивает только инты\то что к ним сводится). Можно попробовать поиграться с неявным приведением типов (а-ля класс-компаратор), но не думаю, что прокатит (цепочка QString->класс->int не сработает, ибо компилятор делает только 1 пользовательское и 1 встроенное преобразование, а тут 2 пользовательских)


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: KADABRA от Август 19, 2010, 09:03
В свиче можно использовать только базове типы.
Сравнивать значение базовых строк в свиче тоже нельзя - получите результат сравнения указателей, а не строк.


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: Sancho_s_rancho от Август 19, 2010, 10:18
Как уже сказали выше - никак. От себя добавлю, что ежели у вас возникает стойкая необходимость пихать строки в switch-подобные инструкции, то скорее всего вы что-то реализовали не лучшим образом. Посмотрите на свой код еще разок или выложите кусок.


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: ecspertiza от Август 19, 2010, 12:04
Согласен со всеми выше, если возникает такая потребность может тебе стоит посмотреть в сторону enum ?  ;)


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: Авварон от Август 19, 2010, 12:08
не правы, из убогости языка не следует то что руки у программера кривые, как раз наоборот...


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: sindbad07 от Август 19, 2010, 12:12
Спасибо всем, занялся qt, сишку вспоминаю потихоньку, сделат через if, потом думаю можно через какой-нибудь контейнер замутить (когда объектов станет совсем много)


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: zenden от Август 19, 2010, 12:17
Цитировать
Подскажите как сделать свитч для строк. Спасибо.

Переходите на язык D, там есть и свитч для строк и много других вкусностей.


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: Igors от Август 19, 2010, 12:23
Спасибо всем, занялся qt, сишку вспоминаю потихоньку, сделат через if, потом думаю можно через какой-нибудь контейнер замутить (когда объектов станет совсем много)
Через if конечно можно, но уж очень коряво  :)  Зачем "тип" (ID) объявлять QString? Сделайте его напр int а строки свалите в QMap или QHash. Надо печатать строки - возьмете
Код
C++ (Qt)
QHash type2name <int, QString>;
...
type2name[id] = "The Name 1";   // запомнили имя для этого id
...
// теперь строка всегда под рукой
edit->setText(type2name[id]);
 


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: sindbad07 от Август 19, 2010, 12:51
Спасибо всем, занялся qt, сишку вспоминаю потихоньку, сделат через if, потом думаю можно через какой-нибудь контейнер замутить (когда объектов станет совсем много)
Через if конечно можно, но уж очень коряво  :)  Зачем "тип" (ID) объявлять QString? Сделайте его напр int а строки свалите в QMap или QHash. Надо печатать строки - возьмете
Код
C++ (Qt)
QHash type2name <int, QString>;
...
type2name[id] = "The Name 1";   // запомнили имя для этого id
...
// теперь строка всегда под рукой
edit->setText(type2name[id]);
 

Мне надо, в звисимости от названия (строки) разные (объекты) классы создавать, предыстория:

есть абстрактные классы МЕНЕДЖЕР_ОБЪЕКТОВ, РЕДАКТОР_ОБЪЕКТА,
производные от них классы менеджеров и объектов

в базовом классе МЕНЕДЖЕР_ОБЪЕКТОВ есть конструктор, который инициализирует выборку объектов (в него передается строка с видом объектов, далее он делает выборку из базы данных из одной общей таблицы (каталога) с фильтром по данному типу объектов ),
также в менеджере есть метод, открывающий редактор объекта, ВОТ СДЕСЬ мне и надо, в зависимости от типа объекта создать конкретный класс-редактор, потому как метод - общий для производных классов.



Название: Re: Как подружить оператор выбора switch и QString
Отправлено: Авварон от Август 19, 2010, 13:44
а если копнуть в сторону QMetaType::construct ?


Название: Re: Как подружить оператор выбора switch и QString
Отправлено: Sancho_s_rancho от Август 19, 2010, 22:12
Цитировать
Подскажите как сделать свитч для строк. Спасибо.

Переходите на язык D, там есть и свитч для строк и много других вкусностей.
Спасибо за информацию, буду избегать язык D. И объясню почему: switch  позволяет переходить в зависимости от "чисто конкретного условия", строки этому правилу не удовлетворяют, т.к. к примеру в одном случае строчные и заглавные буквы слова равноценны, а в другом - это принципиально разные слова. Та же фигня с пробелами. Существует короткое, среднее и длинное тире. Они равнозначны? Т.е. либо этот switch будет дубовый и использовать его можно будет только в очень редких случаях, когда необходимо перепрыгнуть по точному соответствию, либо такой switch  будет работать "по понятиям". Т.е. все типы тире считать просто тире, а все кружочки в юникоде считать символом градуса :D. При этом скорость работы таких switch будет на порядок меньше классического.