![]() |
|
Модераторы: bsa |
![]()
|
|
| SABROG |
|
||||||||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
У меня около 30 обычных функций с одной и той же сигнатурой, но разным поведением. Есть общая функция в которую поступает структура, где одно из полей типа int state. В зависимости от этого state я вызываю одну из 30 функций. Писать switch() с 30 case'ами не хочется. Что остается, массив с хендлерами (callback'ами)
? Если будут варианты, то хотелось бы на чистом C++ с/без stl. Boost и tr1 не предлагайте, пожалуйста. --- Есть такая глупость:
Сделал, чтобы не приходилось в нескольких методах создавать временную переменную, которая передается в другую функцию:
При таком объявлении:
--- В случае с классом вместо структуры мне достаточно вызвать метод так:
Как вы могли заметить дизайн структуры гораздо проще и читабельней, но в случае с ней приходится писать много лишнего потом. Вопрос в том, возможно ли инициализировать переменные-члены структуры нулями во время передачи её в качестве default-constructed argument для метода класса? Что-то типа этого:
|
||||||||||||
|
|||||||||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Если я правильно понял суть сего длинного поста... В структуре можно сделать конструктор и написать в нем:
Таким образом по умолчанию в в функцию попадет структура, инициализированная нулями. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
По этому поводу такой комментарий встретил:
|
||||||
|
|||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Там про классы написано с виртуальными методами и сложными данными внутри, как я понял. Структуре с членами-интами и прочими POD-типами ничего не станет, как я считаю, по крайней мере сам применял такой подход неоднократно, и проблем не было.
ЗЫ. Да и классам с таблицей виртуальных функций, но с простыми POD-членами, тоже ничего не станет, т.к. те компиляторы, что я я видел, отделяют данные от всего прочего и указать на объект фактически является указателем на поле данных объекта. Добавлено через 6 минут Ну и в догонку, писать больше, но проблем с "плохой инициализацией" не будет:
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| KOHCEPBATOP |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 21.4.2010 Репутация: 1 Всего: 1 |
Если очень боязно, можно сделать так:
|
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
SABROG
может так? Это сообщение отредактировал(а) azesmcar - 30.4.2010, 12:56 |
|||
|
||||
| SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Разве стандарт гарантирует, что все значения будут инициализированы нулями?
А этот вариант интересен. Я правильно логику понимаю, тут происходит Си cast безымянного set'a (?) с целочисленными значениями к MyStruct? Аналогично:
Тогда странно, что такие варианты не работают:
Это сообщение отредактировал(а) SABROG - 30.4.2010, 13:46 |
||||||
|
|||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
SABROG, ага. Только не знаю, как правильно называется этот безымянный сет, не силен в теории. Вспомнил о нем, так как иногда применяю, когда нужно передать в функцию некоторую структуру, а отдельной строкой (и переменной!) инициализировать ее не хочется.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Удалено по причине: копия
Это сообщение отредактировал(а) djamshud - 30.4.2010, 13:46 -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| KOHCEPBATOP |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 21.4.2010 Репутация: 1 Всего: 1 |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Похоже это называется анонимной структурой, и с ней похоже тоже не все так гладко: http://stackoverflow.com/questions/177393/...-structure-in-c
|
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну это смотря кого инициализировать.. может и не нулем не аналогично.. только константной ссылке можно присваивать временный рвалуе объект.. Добавлено через 4 минуты и 17 секунд
отличная аргументация
а вот хотелось бы поподробней узнать, что имелось ввиду.. Это сообщение отредактировал(а) mes - 30.4.2010, 13:52 |
||||||
|
|||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
>http://stackoverflow.com
Проблема их была в том, что структура была размером в 4 мегабайта и стэк заканчивался из-за ее копии. >( struct bigstruct ){ 0 } Тут надежда, что компилятор поймет, что всю структуру нужно инициализовать нулем, а компилятор, как я понимаю, делать этого не обязан. При явном перечислении членов структуры проблемы нет. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Значит gcc 4.4.1 не следует стандарту? Все компилится и работает без константности.
По иронии название их сайта совпадает с проблемой Ясно. Значит правила все-таки есть. Инициализировать каждый член по отдельности. Добавлять ключевое слово "struct", чтобы оставить совместимость с языком Cи. Осталось понять насчет константности ссылки и почему static_cast'ом нельзя привести безымянную структуру к нужному типу. По второму вопросу, с хэндлерами, есть мысли? |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |