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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Опять указатели...  (Прочитано 11836 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
direct
Гость
« : 14-03-2005 15:45 » new

Объявляю класс:
class A {
public:
static void func(int);
static void (*pf)(int);
A(){pf = func;}
};
Далее, в программе идет объявление объекта: A objA;
Линкер ругается, что не определена переменная objA::pf,
как ее корректно определить?
Спасибо за ответ!
Записан
Михалыч
Команда клуба

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

« Ответ #1 : 14-03-2005 17:08 » 

Память под статические члены класса не выделяется в объектах этого класса.
Это надо сделать самому. Статические данные-члены класса должны быть глобальными.
В вашем случае это указатель на функцию.
Указатель на статическую функцию объявляется без спецификации класса.
Явная спецификация класса необходима лишь при инициализации указателя.
Пример вашего случая - указатель на статическую функцию с параметрами:
void (*pf)(int) = &A::func;
Вызов статической функции с параметрами по указателю:
int retval = (*pf)(255);
Вызов статических функций-членов класса не требует никаких объектов и указателей на объекты. От обычных функций их отличает лишь специфическая область видимости.
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
direct
Гость
« Ответ #2 : 14-03-2005 20:54 » 

А почему такой вариант не проходит (хочется без статических переменных обойтись:):
class A;
typedef void (A::*pf)(int);
class A{
public:
A();
void func(int);
};
...
pf pfunc = A::func;
pfunc(255) - ошибка, вызов не функции!
Записан
Михалыч
Команда клуба

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

« Ответ #3 : 15-03-2005 05:06 » 

Ну, так, а это... А указатель то кто разыменовывать будет??? Улыбаюсь
Так оно без этого и не функция вовсе Улыбаюсь а указатель...
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Serega
Гость
« Ответ #4 : 15-03-2005 08:17 » 

A a;
A::pf pfunc = A::func;
a.*pfunc(255);
Записан
direct
Гость
« Ответ #5 : 15-03-2005 19:00 » 

A a;
A::pf pfunc = A::func;
a.*pfunc(255);
Ну тут еще больше стало ошибок:) pf не член класса А, pfunc без прототипа, и снова вызов не функции:((
Записан
Serega
Гость
« Ответ #6 : 15-03-2005 20:18 » 

Да, попутал, думал pf обьявлен внутри A
Вызов можно так переписать если компилятор ругаться будет
(a.*pfunc)(255);
Записан
Anchorite
Гость
« Ответ #7 : 15-03-2005 20:27 » 

Код:
class A {
public:
static void func(int n) { printf("finc called\n"); }
static void (*pf)(int);
A() {pf = func;}
};

void (*A::pf)(int) = A::func;

int main(int argc, char* argv[])
{
A::pf(255);

return 0;
}


Это точно работает Ага
А в твоем примере у func просто нет тела. Вот линкер и матерится Ага
Записан
Anchorite
Гость
« Ответ #8 : 15-03-2005 20:37 » 

Цитата
Ну, так, а это... А указатель то кто разыменовывать будет

А по этому поводу можно сказать следующее - имя функции и имя массива уже сами по себе являются указателями и их можно не разыменовывать.
Записан
direct
Гость
« Ответ #9 : 16-03-2005 16:36 » 

Да там было тело у функции (void A::func(int n){cout<<n;}), просто решил место сэкономить:))) Линкер ругался, что не функция вызывается. Похоже, действительно надо разыменовывать указатель....
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines