21.05.2007, 11:25 | #1 |
Moderator
|
Аналог round() возвращающий int
Добрый день.
Нет и стандартного аналога round(), возвращающего int? Цель - избежать предупреждения - "Присвоение/Сравнение теряет точность.". |
|
21.05.2007, 11:33 | #2 |
SAP
|
Я думаю что нет. Так как это получается функция котороя должна округляць только до целого и целое. Но ее же не проблема написать.
|
|
21.05.2007, 11:39 | #3 |
Участник
|
any2int(round(...
|
|
21.05.2007, 11:42 | #4 |
Moderator
|
Спасибо. Надежно работает? Есть у меня некоторое опасение при использовании функций с префиксом/суффиксом 'any'.
|
|
21.05.2007, 11:46 | #5 |
Участник
|
не проверял - просто как предположение. Вообще в приложении вроде используется...
Мне кажется, решать задачу исключения ворнингов имеет смысл только при разработке собственных крупных модулей. |
|
21.05.2007, 11:51 | #6 |
Moderator
|
Цитата:
Мне кажется, решать задачу исключения ворнингов имеет смысл только при разработке собственных крупных модулей.
|
|
21.05.2007, 12:13 | #7 |
Moderator
|
Кстати, я правильно помню, что отсутствие вызова конструктора в классе-наследнике конструктора предка есть, в общем то, ошибка проектирования классов? О чем компилятор мне и говорит - "Новый метод производного класса не вызывает super()." (ComExcelDocument_ru.new()).
|
|
21.05.2007, 12:15 | #8 |
Участник
|
Нет.
|
|
21.05.2007, 12:17 | #9 |
Участник
|
не обязательно проектирования. Просто могут забыть его позвать, если и так работает. При этом есть вероятность возникновения ошибки, если в базовом классе добавят инициализацию.
|
|
21.05.2007, 12:24 | #10 |
Moderator
|
Цитата:
Нет.
Назначение конструктора - инициализация внутренних структур данных класса. Если мы создаем наследника - значит, мы ожидаем, что он будет пользоваться данными предка. Если мы не вызываем конструктор предка значит мы допускаем потенциальную возможность, что класс-наследник обратится к неициализированным данным предка, что может быть большой проблемой. Решения, которые я вижу: 1) Вызывать конструктор предка. 2) Выносить переменные, которые не должны использоваться наследниками в отдельные классы (или скрывать их каким-то другим способом, если это позволяет делать язык разработки). |
|
21.05.2007, 12:44 | #11 |
Участник
|
Прежде договоримся о терминах.
Конструктором в Аксапте называется статичный метод Constuct. Его задача: создать экземляр класса конкретного типа на основании переданных параметров. См. раздел Construct class pattern в Best Practice. Цитата:
...use a construct method to instantiate the correct subclass for you
По идее, конструктор родителя иерархии классов должен вызывать контрукторы своих детей. Но в Аксапте разработчики "упростили" код и контруктор родителя всегда инициализирует детей через new. Т.е. по замыслу разработчиков конструктор должен быть один и должен находится в корне иерархии. (Если ты под конструктором подразумевал метод new, то я с тобой полностью согласен: у каждого класса должен быть свой new) |
|
21.05.2007, 12:46 | #12 |
Moderator
|
Цитата:
(Если ты под конструктором подразумевал метод new, то я с тобой полностью согласен: у каждого класса должен быть свой new)
Мое сообщение ранее: Цитата:
О чем компилятор мне и говорит - "Новый метод производного класса не вызывает super()." (ComExcelDocument_ru.new()).
|
|
21.05.2007, 12:49 | #13 |
Участник
|
Виноват.
Да, new у каждого свой и new потомка должн содержать super(). |
|
21.05.2007, 12:53 | #14 |
Участник
|
Единственное упоминание слова constructor в "Construct class pattern" относится к new: "...have a no parameters, or the same parameters as the default new constructor (it is recommended that you do not have parameters on new)" |
|
21.05.2007, 13:03 | #15 |
Участник
|
Ищи слово construct.
Вот еще с раздела Class constructors and destructors Цитата:
construct
The class hierarchy has one public constructor with no parameters that will deliver the correctly initialized class object. |
|
21.05.2007, 13:11 | #16 |
Участник
|
Все они конструкторы...
|
|
21.05.2007, 16:43 | #17 |
Участник
|
собственно, если вернуться к исходному вопросу, кроме round() есть еще, возможно, более подходящая в данной ситуации функция decRound(real number, int decimals), округляющая number до нужного числа десятичных разрядов. Впрочем, вызов decRound(number, 0) и round(number, 1.0), видимо, будут эквивалентны.
|
|