Russian Qt Forum
Ноябрь 24, 2024, 06:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как подружить оператор выбора switch и QString  (Прочитано 12396 раз)
sindbad07
Гость
« : Август 19, 2010, 08:37 »

Здравствуйте, делаю так:

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

компилятор ругается: "error: switch quantity not an integer"
Подскажите как сделать свитч для строк. Спасибо.
Записан
BRE
Гость
« Ответ #1 : Август 19, 2010, 08:57 »

switch может работать только с целыми типами.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Август 19, 2010, 08:57 »

никак, в с++ это ограничение свитча (он сравнивает только инты\то что к ним сводится). Можно попробовать поиграться с неявным приведением типов (а-ля класс-компаратор), но не думаю, что прокатит (цепочка QString->класс->int не сработает, ибо компилятор делает только 1 пользовательское и 1 встроенное преобразование, а тут 2 пользовательских)
Записан
KADABRA
Гость
« Ответ #3 : Август 19, 2010, 09:03 »

В свиче можно использовать только базове типы.
Сравнивать значение базовых строк в свиче тоже нельзя - получите результат сравнения указателей, а не строк.
Записан
Sancho_s_rancho
Гость
« Ответ #4 : Август 19, 2010, 10:18 »

Как уже сказали выше - никак. От себя добавлю, что ежели у вас возникает стойкая необходимость пихать строки в switch-подобные инструкции, то скорее всего вы что-то реализовали не лучшим образом. Посмотрите на свой код еще разок или выложите кусок.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Август 19, 2010, 12:04 »

Согласен со всеми выше, если возникает такая потребность может тебе стоит посмотреть в сторону enum ?  Подмигивающий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Август 19, 2010, 12:08 »

не правы, из убогости языка не следует то что руки у программера кривые, как раз наоборот...
Записан
sindbad07
Гость
« Ответ #7 : Август 19, 2010, 12:12 »

Спасибо всем, занялся qt, сишку вспоминаю потихоньку, сделат через if, потом думаю можно через какой-нибудь контейнер замутить (когда объектов станет совсем много)
Записан
zenden
Гость
« Ответ #8 : Август 19, 2010, 12:17 »

Цитировать
Подскажите как сделать свитч для строк. Спасибо.

Переходите на язык D, там есть и свитч для строк и много других вкусностей.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 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]);
 
Записан
sindbad07
Гость
« Ответ #10 : Август 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]);
 

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

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

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

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Август 19, 2010, 13:44 »

а если копнуть в сторону QMetaType::construct ?
Записан
Sancho_s_rancho
Гость
« Ответ #12 : Август 19, 2010, 22:12 »

Цитировать
Подскажите как сделать свитч для строк. Спасибо.

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


Страница сгенерирована за 0.086 секунд. Запросов: 23.