Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Простой вопрос по классу  (Прочитано 7294 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
cooler
Участник

ru
Offline Offline
Пол: Мужской

« : 01-03-2005 13:57 » new

Есть класс:
Код:
class XAXA 
{
 ...
 void (WINAPI *funcCallBackGlobal)(LPSTR buf,DWORD len);

 void InitializeGlobal(string szName,
                      void (WINAPI *CallBack1)(LPSTR buf,DWORD len));

 static void WINAPI Call1(LPSTR buf,DWORD len);
 ...
}

void XAXA ::InitializeGlobal(string szName,
           void (WINAPI *CallBack1)(LPSTR buf,DWORD len))
{
  funcCallBackGlobal = CallBack1;
  ...
}

Как из функции Call1 вызвать funcCallBackGlobal(...)?
void XAXA ::Call1(LPSTR buf,DWORD len)
{
 funcCallBackGlobal(buf,len);
}
Даёт ошибку error C2064: term does not evaluate to a function
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #1 : 01-03-2005 15:27 » 

проблема вся в том что ты пытаешся воспользоваться нестатик членом класса из глобальной функции. Так не пойдет. Статик члены инициализируются при запуске программы, а нестатик при создании обекта. Получается казус - попытка обратиться к члену класса которого нет в природе, память под него не выделена, обекта нет - использовать мы его не можем.
Надо только себе уяснить, что обращаться к статическим членам класса мы можем не создавая обект!
гдето в программе  XAXA::Call1(...) и все.
если обявишь void (WINAPI *funcCallBackGlobal)(LPSTR buf,DWORD len); как статик все будет работать Ага
« Последнее редактирование: 01-03-2005 15:29 от Pu » Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
cooler
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 02-03-2005 07:50 » 

если обявишь void (WINAPI *funcCallBackGlobal)(LPSTR buf,DWORD len); как статик все будет работать Ага

Пробовал
static void (WINAPI *funcCallBackGlobal)(LPSTR buf,DWORD len);

Но тогда вылезает ошибка - неразрешённая внешняя ссылка
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #3 : 02-03-2005 09:15 » 

а проинициализировать забыл?
Код:
class XAXA 
{
...
static void (WINAPI *funcCallBackGlobal)(LPSTR buf,DWORD len);

void InitializeGlobal(string szName,
                      void (WINAPI *CallBack1)(LPSTR buf,DWORD len));

static void WINAPI Call1(LPSTR buf,DWORD len);
...
};

void XAXA::(WINAPI *funcCallBackGlobal)(LPSTR buf,DWORD len) = 0; //инициализация указателя

все статик члены должны быть предварительно проинициализированы, те компилятор смотрит и выделяет память под этот указатель.
« Последнее редактирование: 02-03-2005 09:18 от Pu » Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines