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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразования типов  (Прочитано 5400 раз)
Steven_Orko
Гость
« : Февраль 21, 2006, 14:30 »

Вот имеются несколько своих типов:
Код:
class QLICLSmallInt;  //Целое число (значения от -32.768 до +32.767);
class QLICLInteger;   //Целое число (значения от -2.147.483.648 до +2.147.483.647)
class QLICLBigInt;    //Целое число (значения от -9.223.372.036.854.775.808 до + 9.223.372.036.854.775.807)
class QLICLReal;      //Число с плавающей точкой (значения от -1.0E+38 до +1.0E+38, точность - 6 значащих цифр)
class QLICLDouble;    //Число с плавающей точкой двойной точности (значения от -1.0E+38 до +1.0E+38, точность - 15 значащих цифр)
class QLICLBoolean;   //Логическое значение: false/true

class QLICLDate;      //Данные типа дата + время
class QLICLDecimal;   //Число с фиксированной точкой, содержащее не более 30-ти десятичных цифр, десять (10) из которых после десятичной точки
class QLICLBlob;      //Длинные байтовые объекты (длиной до 64-х гигабайт)
class QLICLBytes;     //Строка байтов фиксированной длины (не более 4000)
class QLICLVarBytes;  //Строка байтов переменной длины (не более 4000 символов)
class QLICLChars;     //Строка символов фиксированной длины (не более 4000 символов)
class QLICLVarChars;  //Строка символов переменной длины (не более 4000 символов)
class QLICLString;    //Символьная строка, заканчивающаяся нуль-символом
class QLICLNChars;    //Строка символов фиксированной длины в универсальной кодировке (UNICODE) (не более 2000 символов)
class QLICLNVarChars; //Строка символов переменной длины в универсальной кодировке (UNICODE)
class QLICLExtFile;   //Локальный файл любого текстового формата



Хотел посоветоваться со всеми. Кто как считает, какие преобразования между ними, а также со встроенными типами  и типами Qt лучше определить для удобной работы?

P.S. Вопрос: "Зачем создал аналоги встроенных типов?".
Отвечаю: Не устраивало их поведение, а также плохо понятный синтаксис использования в некоторых случаях.
Записан
Hordi
Гость
« Ответ #1 : Февраль 21, 2006, 17:31 »

Для удобной работы лучше никаких синонимов базовых типов вообще не создавать. Выглядит ужасно, писать много, и в  итоге непонятно зачем.
Записан
Steven_Orko
Гость
« Ответ #2 : Февраль 21, 2006, 18:56 »

Цитата: "Hordi"
Для удобной работы лучше никаких синонимов базовых типов вообще не создавать. Выглядит ужасно, писать много, и в  итоге непонятно зачем.

Очень полезное замечание, особенно принимая во внимание то, что я написал в P.S.
Эти типы уже есть. Вопрос ставится по поводу преобразований. Какие уместно, удобно было бы ввести для более наглядного, удобного использования (и интеграции во множество встроенных) указанных типов?
Записан
Hordi
Гость
« Ответ #3 : Февраль 21, 2006, 20:08 »

Так ведь это все пройденны этап! Кроме гемороя для себя и, особенно, других, ничего не дает. Какие могут быть рекомендации? Ну напиши операторы приведения к любому типу - больше вариантов и быть не может.
Единственное, что я могу понять, так это определение денежного типа, т.к. при использовании double постоянно округление нужно использовать, да и еще подводных кмней много, но писать КЛАСС! для bool-типа - это слишком.

добавлено спустя 2 минуты:

 Давай твой P.S. покопаем:
1.Какое поведение базовых типов не устраивает?
2.Какой такой НЕПОНЯТНЫ синтаксис использования в НЕКОТОРЫХ случаях?

Может все решится и без переопределения типов...
Записан
Steven_Orko
Гость
« Ответ #4 : Февраль 21, 2006, 20:45 »

Цитата: "Hordi"
Давай твой P.S. покопаем:
1.Какое поведение базовых типов не устраивает?
2.Какой такой НЕПОНЯТНЫ синтаксис использования в НЕКОТОРЫХ случаях?

Может все решится и без переопределения типов...

Окей. Какой фундаментальный, встроенный тип можно использовать для хранения вещественного значения c фиксированной точкой, имея при этом в целой части 20 цифр, а в вещественной 10?
Фундаментальные классы нельзя встроить в свою иерархию классов. И нельзя сказать компилятору, что его фундаментальный тип double теперь я хочу рассматривать всего лишь как наследник базового типа, например, BaseType. Соответственно, я не могу переопределить их (типы) таким образом, чтобы обеспечить в известной степени полиморфизм для моих функций, методов классов, которые используют (должны по идее) указанные выше типы данных.
К тому идеологически, ИМХО, более верно создать не библиотеку функций, работающих с конкретным типом данных, а, например, класс. Но это я уже пошел к идеологии объектно-ориентированного программирования.
"Это уже проходили" - ага, и проходим снова, так как те же Trolltech в своем продукте переназывают, а в некоторых случают, переопределяют типы, создают свои, новые...
Следую выше приведенному топику, зачем они (тролли) создали свой QVariant, а не использовали для этого обычное union? А именно потому что использование объекта класса QVariant хорошо вписывается в идеологиию объектно-ориентированного программирования, но ни как не переменная типа union. Хотя в некоторых случаях ее тоже можно трактовать как класс, правда с большими ограничениями для все той же идеологии.
Если кратко, то вот причина создания своих типов данных, в чем-то схожих с фундаментальными, но только схожих. По большому счету, мои классы расширяют их и позволяют работать со значениями, используя более наглядный синтаксис.
Записан
Hordi
Гость
« Ответ #5 : Февраль 21, 2006, 21:05 »

Ты говоришь о вещественном типе 20.10, а определяешь свой класс для bool! Универсального ничего нет. Посмотри на Microsoft - у них использовалась просто венгерская нотация, но им нужно было определить какой нибудь стандарт, т.к. коллектив большой. Честно говоря, я ни разу не встречал полного классового переопределения базовых типов - это уже язык новый получится.
Еще раз повторю: для денежных типов, огромных чисел или наоборот-очень маленьких, короче для специализированых задач нужно разрабатывать свои классы, но у тебя не тот случай.

Не нужно путать QVariant с union и передергивать принципиально разные вещи. Я же не говорю тебе что все типы нужно заменить на void*. Если ты внимательно посмотришь на библиотеку qt, то заметишь, что qvariant в основном используется при работе с базой данных, т.е. в случае, когда значения полей получаются произвольных типов. Иерархия здесь абсолютно ни при чем, просто кроме QVariant ничего не подойдет.

> работать со значениями, используя более наглядный синтаксис
Ты считаешь, что этот набор типов сделает синтаксис более наглядным?Ты в это веришь?
Записан
Steven_Orko
Гость
« Ответ #6 : Февраль 21, 2006, 21:30 »

Ну, в армии есть такой принцип - "единообразие" ))) Некоторые типы  я определяю именно для него. К тому же, повторюсь, я добавляю им специальную семантику. Согласен, получается новый язык в языке... но это касается всех специализированных библиотек. Тоже самое можно сказать и про STL. Согласен про огромные числа, денежные типы и т.л.
QVariant у троллей внутри себя использует union, можно считать, что это сложная оберка к объединению. Да, он в основном, используется при работе с БД. Моя тематика та же.
По поводу синтаксиса. Здесь не может быть абсолютно правильного мнения. Например, я считаю, что нагляднее иметь функцию-член setNum() для преобразования числа в строку, чем три-четыре строки,используя C-типы и функцию преобразования itoa. К этому еще необходимо прибавить код на проверку корректности преобразования.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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