![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Вопрос довольно хитрый и содержит тьму подводных камней:
Есть класс и его потомок:
Как мне избежать инстанциирования объекта MsgMap в родительском классе, если я создаю экземпляр класса потомка, по возможности избегая лишних строк кода. В идеале я бы хотел это сделать во время компиляции. -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Поступила мысль сделать этот член статическим, но это не убирает главной проблемы, так как классы будут все равно созданы от корня => отработают деструкторы по умолчанию => инстанциируются не нужные обработчики сообщений, а именно этого я и хочу избежать.
Конечно можно было бы в каждом конструкторе бервым делом чистить содержание карты но это расточительно с точки зрения быстродействия -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
Royan
Я правильно понял, что хочется иметь один экземпляр MAP на каждый класс (что-то типа VTBL, к примеру, VTBL) думаю, что хорошо эта проблема средствами C++ не решается. Статический map будет один на всю программу - соответственно, одной карты сообщений на всех мало. Можно подумать относительно глобальной карты где ключем будет: (const char* +message), const char * - указатель на название класса окна, можно получить через RTTI - но это тоже плохо катит в случае наследования. btw, зачем такой код нужен вообще? Один фиг для каждого класса окна нужно будет вызывать функцию, которая добавляет обработчики сообщений в карту (что-то врода AddMessageHandler(WM_PAINT, OnPaint);...). Соответственно, кода становится ничуть не больше, если использовать виртуальную функцию обработки сообщений, устроенную примерно так if( msg == WM_PAINT )return OnPaint(); else if( msg == WM_LBUTTONDOWN )return OnLButtonDown(HIWORD(l), LOWORD(l)); else ... короче, как сделано в ATL кроме наглядности, такой подход имеет ряд преимуществ - можно при вызове функций передавать не абстрактные WPARAM, LPARAM, а раскрытые данные сообщения. Кода не больше, а очевидность выше и не нужна карта - что еще нужно. Выигрыш по производительности поиска от использования map для реализации карты сообщений минимальна, особо если часто используемые сообщения вытащить "наверх" в первые сравнения. |
|||
|
||||
| Sceptik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.8.2006 Где: Екатеринбург Репутация: нет Всего: нет |
class Window{
... virtual const std::map<int, MsgHandler> &getMsgMap() { static std::map<int, MsgHandler> msgMap; return msgMap; } }; |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Sceptik, надо полагать и Royan и Gaz за прошедшие годы как-то решили свои проблемы...
-------------------- ... |
|||
|
||||
| Sceptik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.8.2006 Где: Екатеринбург Репутация: нет Всего: нет |
Earnest,
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |