![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Можно ли реализовать вот этот Java-класс на Си++ ?
У меня, как я не пытался, не получилось. ![]() -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Есть подводные камни, но работать должно. Лучше так не далать, это по сути, ошибка проектирования. |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
уж лучше тогда в данном случае
а еще лучше сделать приемлемые параметры по умолчанию -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Да... здесь лучше сделать параметры по умолчанию. (А в яве нет параметров по умолчанию) Пример просто не удачен.
Вот с операцией new(this) мне понравилось. Я видел в бнф, что у new скобки есть, а для чего они нужны не понимал. Значит, при такой форме она новую память не выделяет... -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
да, это placement new -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Не нужно это в таком месте. В данном месте рулят параметры по умолчанию и единственный конструктор.
-------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
не факт если сделать параметрыпо умолчанию, то никто не помешает передать один, а это значит, что нельзя уже сделать консруктор с одним параметром пример: когда без параметров - 2,3 когда с одним параметром - эквивалентно x,x -------------------- qqq |
|||
|
||||
SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
DeadSoul,
-------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: нет Всего: 5 |
SaDFromSpb, факт.
-------------------- Never again... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
что по мне вполне логично -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
akahan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 11.2.2007 Репутация: нет Всего: нет |
Подниму опять эту тему, т.к. не совсем понял.
Из вышесказанного получается, что С++ не предусматривает возможность вызова одного конструктора из другого. Это действительно так? И будет ли работать вот этот код? Всмысле какие могут быть последствия этого кода, если могут быть????
|
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
это приводит к созданию на стеке нового объекта, потом присваиванию его полей текущему (консруктор которого вызывается), а потом - удалению промежуточного
конечно, оптимизатор может сильно сократить этот набор действий (может, даже сделать его эквивалентным вызову конструктора с параметрами), но далеко не в каждом случае даный случай - довольно-таки простой, так что вроде всё должно быть нормально но при усложнении структуры объектов, могут начаться неоправданные затраты ресурсов кроме того, не все классы позволяют присваивание одних объектов другим, так что способ не очень универсальный есть ещё один вариант: напимать protected/private метод, который будет содержать код второго конструктора, и вызывать его из обоих он тоже имеет недостаток - некоторые поля (например, const или ссылки) могут не поддерживать присваивания, а списки инициализации доступны только в конструкторе, да и опять же в случае использования такого метода, поля-объекты сначала создадутся, а уже потом им присвоят значения, что тоже может повлечь неоправданные затраты ресурсов... -------------------- qqq |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да, так. Вышеприведенные методы в простых случаях работают, но не универсальны и являются ничем не оправданным извращением. Проблемы начнутся (скорее всего) при наследовании и (точно) если объект не copy-constructable. Проблемы с многократным написанием кода инициализациии (от чего призван избавить описанный изврат) решаются изменением дизайна: 1) константы - а так ли уж надо использовать константы внутри классов? Это все решается инкапсуляцией + соотв. функции. Ну если уж очень хочется, руки не отваляться инициализировать ее в каждом конструкторе. 2) ссылки. Опять же, если так влом инициализировать в каждом конструкторе - ну замени на указатель и инициализируй в общей функции. 3) вложенные объекты, которые при конструировании могут сожрать много ресурсов, а потом их нужно переинициализировать ... - тоже переходим на указатели... "лишнюю" инициализацию указателей или простых типов, полагаю, можно простить... Ну и т.д. Не говоря уж о том, что если все это возникает вместе в одном классе, пора подумать о редизайне, т.е. хороший класс должен быть монолитен и решать одну задачу. -------------------- ... |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
MAKCim, в C# это практикуется с большой силой, что помогает уменьшить объем кода вбиваемо. В принципе , я так глянул - не сильно это читаемость убивает. Но лучше не заигрываться, конечно.
|
|||
|
||||
SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Нда... В яве к этой фишке тоже быстро привыкаешь.... С одной стороны это может быть и академически неправильно, зато довольно удобно, когда нет такой фишки, как параметры по умолчанию ![]() А вообще в джаге еще много чего нет ![]() Это сообщение отредактировал(а) SaDFromSpb - 3.3.2007, 02:42 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |