Форум программистов, компьютерный форум CyberForum.ru

Указатель на функцию - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
14.02.2011, 21:12     Указатель на функцию #1
Уже сломал всю голову, на что здесь может ругаться компилятор, выдавая такую ошибку?

main.cpp:23: error: invalid use of non-static member function ‘int Cat::GetAge()’

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using std::cout;
 
class Cat
{
    public:
    Cat(): itsAge(1) { HowManyCats++; cout << "Котов: " << HowManyCats; };
    ~Cat() { HowManyCats--; cout << "Котов: " << HowManyCats; };
    int GetAge() { return itsAge; };
        static int HowManyCats;
 
    private:
    int itsAge;
};
 
    int Cat::HowManyCats = 0;
 
int main()
{
        Cat Murzik;
        cout << Cat::HowManyCats;
    int (Cat::*AGE) ();
    AGE = Cat::GetAge;
    (Murzik.*AGE)();
    return 0;
}
Уже и так всё поупростил.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2011, 21:12     Указатель на функцию
Посмотрите здесь:

Указатель на указатель на функцию C++
Как передать указатель на функцию в функцию C++
C++ В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? C++
Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
14.02.2011, 21:20     Указатель на функцию #2
getage д б вызвана для конкретного кота
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
14.02.2011, 21:25  [ТС]     Указатель на функцию #3
Тоже был вариант.
Но: (Murzik.*AGE)(); - вот вызвана для конкретного объекта.

Добавлено через 57 секунд
Или я вызвал неправильно?

Добавлено через 2 минуты
Еррор пишет на 23 строке. там где идёт присвоение. почему нельзя так присваивать?
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
14.02.2011, 21:30     Указатель на функцию #4
C++
1
AGE = &Cat::GetAge;
Преобразование функции в указатель не работает для функций - членов класса.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
14.02.2011, 21:32     Указатель на функцию #5
Для того чтобы получить указатель на функцию или сделать функцию обратного вызова
необходимо ее объявить как статик
о чем тебе и написали
invalid use of non-static member function ‘int Cat::GetAge()’
^^^^^^^^^^^^
когда функция не объявлена статиком она может всообше не компилится компилится для каждого объекта т.е найти ее адрес до выполнения нереально
когда она объявлена как статик она гарантировано скомпилится в одном экземпляре и будет лежать по определенному адресу
правда все объекты будут обращатся к ней одной что чревато побочными эфектами
С уважением Валерий
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
14.02.2011, 21:36  [ТС]     Указатель на функцию #6
Цитата Сообщение от Somebody Посмотреть сообщение
C++
1
AGE = &Cat::GetAge;
Преобразование функции в указатель не работает для функций - членов класса.
Спасибо. Тупанул! Заработало. Та же логика как и с обычными переменными. что-то упустил...
Для того чтобы получить указатель на функцию или сделать функцию обратного вызова
необходимо ее объявить как статик
Нда? Нет, предложенный выше код работает. Статик вообще необязательное и не относящееся сюда условие. При чём оно тут?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
14.02.2011, 21:43     Указатель на функцию #7
ну у борландо много чего работает что противоречит C++
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
14.02.2011, 21:44  [ТС]     Указатель на функцию #8
???? строка вывода из g++.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
14.02.2011, 21:46     Указатель на функцию #9
main.cpp:23: error: invalid use of non-static member function ‘int Cat::GetAge()’
неправильное использование не статической функции
Это я придумал??? или компилятор тебе написал
С уважением Валерий
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
14.02.2011, 21:49  [ТС]     Указатель на функцию #10
Тогда у меня ступор, в этой книжке так написано))) Или я читать не умею чтоль...
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
14.02.2011, 21:56     Указатель на функцию #11
Все конечно хорошо но у меня нет такой книжки
ты бы цитату хоть бы привел.
С уважением Валерий
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2011, 21:58     Указатель на функцию
Еще ссылки по теме:

Передать в неуправляемую функцию указатель на указатель C++
Функция, получающая указатель на обычную функцию, получает указатель на метод класса C++
C++ Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
14.02.2011, 21:58  [ТС]     Указатель на функцию #12
Там идёт точно такое же присвоение, только функция Void. Она не возвращает значение, а выводит в консоль. Перепечатывал в копеечку. Ещё почитаю...
Yandex
Объявления
14.02.2011, 21:58     Указатель на функцию
Ответ Создать тему
Опции темы

Текущее время: 19:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru