![]() |
|
Модераторы: bsa |
![]()
|
|
| AndrewWK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.9.2015 Репутация: нет Всего: нет |
Здравствуйте!
Хочу написать реализацию класса свойства на шаблоне. Рабочий код:
Как видно свойство опрашивает заданный функтор - getter, setter и т.д, а использование функторов позволяет сделать не всегда необходимые методы проверки свойства - редактируемо, видимо - методами по дефолту. Но, этот код работает, хотя в каждом функторе в дебаге m_sender= 0xCCCCCC - память неинициализированна. Следовательно вызов в функторе, например, Setter - ((*m_sender).*setter)(val); должно приводить к падению. Оптимизация выключена в опциях компилятора. Почему работает? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Работает потому что неинициализированный m_sender передается в ваш setter (test::setVal) как this (и действительно в виде мусора). Но сам test::setVal this никак не использует, поэтому и не падает
|
|||
|
||||
| AndrewWK |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.9.2015 Репутация: нет Всего: нет |
А этот код безопасен? Вообще, можете подсказать - у меня правильная реализация - или нужно что-то подправить?
А то у меня большие сомнения на этот счет. Допустим я изменю в функторе Setter:
И добавлю в CProperty конструктор
При компиляции падает Microsoft c/c++ Optimizing Compiler - что наводит на мысль, что сделано не так. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| AndrewWK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.9.2015 Репутация: нет Всего: нет |
- правильная всмысле теперь, когда я добавил инициацию m_sender в конструкторе функтора?
Полный код тот же самый + изменения в функторах - добавлен конструктор, даже в тех, что должны вызываться по умолчанию. ( среда VS 2008 , машина Win8.1 x64, тестовое приложение 32 bit) -
Если закоментировать все конструкторы и убрать инициализацию из CProperty конструктора, тогда все ок, а иначе падает оптимизатор. |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
У тебя в CProperty в качестве второго параметра ( GetterFunctor ) передаётся
А в конструкторе CProperty ему скрамливается this (aka CProperty*).
Ты уж определись, кто будет владеть геттерами и сеттерами - test или CProperty Это сообщение отредактировал(а) borisbn - 14.9.2015, 19:25 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
m_setter'у нужен не указатель на CProperty, а указатель на ваш test
ну и инициализировать его соответственно. Добавлено через 1 минуту и 5 секунд пока писал, borisbn, опередил |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "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. |