Форум программистов «Весельчак У»
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
Начало
Наши сайты
Галерея
Весельчак У
Наша Вики
Хранилище
Проекты
Правила
Правила форума
Правила русского языка
Помощь
Поиск
Календарь
Почта
Войти
Регистрация
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
>
ANSI С/С++
(Модератор:
Вад
) > Тема:
Опять указатели...
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Опять указатели... (Прочитано 11074 раз)
0 Пользователей и 1 Гость смотрят эту тему.
direct
Гость
Опять указатели...
«
:
14-03-2005 15:45 »
Объявляю класс:
class A {
public:
static void func(int);
static void (*pf)(int);
A(){pf = func;}
};
Далее, в программе идет объявление объекта: A objA;
Линкер ругается, что не определена переменная objA::pf,
как ее корректно определить?
Спасибо за ответ!
Записан
Михалыч
Команда клуба
Offline
Пол:
Re: Опять указатели...
«
Ответ #1 :
14-03-2005 17:08 »
Память под статические члены класса не выделяется в объектах этого класса.
Это надо сделать самому. Статические данные-члены класса должны быть глобальными.
В вашем случае это указатель на функцию.
Указатель на статическую функцию объявляется без спецификации класса.
Явная спецификация класса необходима лишь при инициализации указателя.
Пример вашего случая - указатель на статическую функцию с параметрами:
void (*pf)(int) = &A::func;
Вызов статической функции с параметрами по указателю:
int retval = (*pf)(255);
Вызов статических функций-членов класса не требует никаких объектов и указателей на объекты. От обычных функций их отличает лишь специфическая область видимости.
Записан
Поживем - увидим... Доживем - узнаем... Выживу - учту
direct
Гость
Re: Опять указатели...
«
Ответ #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) - ошибка, вызов не функции!
Записан
Михалыч
Команда клуба
Offline
Пол:
Re: Опять указатели...
«
Ответ #3 :
15-03-2005 05:06 »
Ну, так, а это... А указатель то кто разыменовывать будет???
Так оно без этого и не функция вовсе
а указатель...
Записан
Поживем - увидим... Доживем - узнаем... Выживу - учту
Serega
Гость
Re: Опять указатели...
«
Ответ #4 :
15-03-2005 08:17 »
A a;
A::pf pfunc = A::func;
a.*pfunc(255);
Записан
direct
Гость
Re: Опять указатели...
«
Ответ #5 :
15-03-2005 19:00 »
Цитата: Serega от 15-03-2005 08:17
A a;
A::pf pfunc = A::func;
a.*pfunc(255);
Ну тут еще больше стало ошибок:) pf не член класса А, pfunc без прототипа, и снова вызов не функции:((
Записан
Serega
Гость
Re: Опять указатели...
«
Ответ #6 :
15-03-2005 20:18 »
Да, попутал, думал pf обьявлен внутри A
Вызов можно так переписать если компилятор ругаться будет
(a.*pfunc)(255);
Записан
Anchorite
Гость
Re: Опять указатели...
«
Ответ #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
Гость
Re: Опять указатели...
«
Ответ #8 :
15-03-2005 20:37 »
Цитата
Ну, так, а это... А указатель то кто разыменовывать будет
А по этому поводу можно сказать следующее - имя функции и имя массива уже сами по себе являются указателями и их можно не разыменовывать.
Записан
direct
Гость
Re: Опять указатели...
«
Ответ #9 :
16-03-2005 16:36 »
Да там было тело у функции (void A::func(int n){cout<<n;}), просто решил место сэкономить:))) Линкер ругался, что не функция вызывается. Похоже, действительно надо разыменовывать указатель....
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
>
ANSI С/С++
(Модератор:
Вад
) > Тема:
Опять указатели...
Загружается...