Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связывание на подобии MFC, Некоторые проблемы с макросами 
:(
    Опции темы
Royan
Дата 21.3.2004, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Привет всем, снова вопрос smile.gif

В MFC используется довольно интересная техника связывания сообщений с их обработчиками, я пытаюсь сделать аналогичный механизм, используя один из приведенных на форуме примеров.

Вот мой код:
Код
#define ON_MYCOMMAND(_Message, theClass, _Method)\
 theClass::theClass[_Message]=&theClass::_Method\


class CMsgHdl{
public:
 virtual int MsgHandler(WPARAM wParam, LPARAM lParam) {return 0; };  

typedef int (CMsgHdl::*lpfnHdl)(WPARAM, LPARAM);
  static std::map<int, lpfnHdl> _CMsgHdl;

};

ON_MYCOMMAND(0x4, CMsgHdl, HandleMsg);//строка 21


Суть такая: внутри класса есть карта содержащая в качестве индекса код сообщения, а в качестве значения указатель на функцию, которая должна обрабатывать это сообщение.

Добавление сообщений и соответственно его обработчика осуществляется с помощью макроса ON_MYCOMMAND, соственно говоря это и есть вся суть, чтобы с помощью макроса добавлялись обработчики, проблема же такова:

При компиляции вышеприведенного кусока кода у меня вылезает следующая ошибка:

Код
d:\My Coding\[...]\main.cpp(21) : error C2761: '__ctor' : member function redeclaration not allowed


Весь интерфейс класса я привел выше, откуда и что такое "__ctor"? Мне это совершенно не понятно, может быть кто знает?





--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
srd
Дата 22.3.2004, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



1. Ошибка в макросе. Должно быть так:
Код

#define ON_MYCOMMAND(_Message, theClass, _Method)\
theClass::_theClass[_Message]=&theClass::_Method

Забыл подчерк перед именем статического члена.

2. Макрос скрывает не определение переменной, а обычную инструкцию присваивания. Следует где-то определить статический член _CMsgHdl, а сам макрос использовать только в теле функций.




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Royan
Дата 28.3.2004, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Спасибо srd, ты как всегда зришь в корень smile.gif, но я несколько раз пересмотрел ситуацию и добился желаемого результата несколько другим способом. Если хочешь могу потом поделиться что и как я сделал.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
srd
Дата 30.3.2004, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Royan
Буду очень благодарен rolleyes.gif Я придумать элегантный способ задания карт сообщений так и не смог.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Royan
Дата 30.3.2004, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Последние проблемы возникли уже после того когда казалось, что все заработало ;) Можно предположить, что если решится проблема обсуждаемая в этом топике http://forum.vingrad.ru/index.php?showtopic=20507 (там же кстати есть и пример создания карты) то каркас создания любого приложения можно считать готовым.

А вообще суть свелась к созданию карты через std::map, но завтра видимо придется писать свою карту, а то стандартная как то ведет себя дурно


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
srd
Дата 31.3.2004, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Нашел любопытный способ здесь


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.