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

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

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

« : 01-12-2010 17:51 » 

Привет.
Внутри класса нужен указатель на функцию-член этого же класса.
Не получается вызвать.
Код:
Код:
class A
{
public:
   
    int (A::*pf)(); // - указатель на ф-ию-член класса A.
    int func1();
    int func2();

    //конструктор
    A() { pf = &A::func1; }
};

//создаю экземпляр класса A и хочу вызвать ф-ию по указателю:

A a;
a.pf();              //не работает
((&a).*pf)();    //не работает
(a.*pf)();         // тоже не работает

//внутри самого класса могу вызвать без проблем
(this->*pf)();

Как правильно, подскажите, пожалуйста.

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 01-12-2010 17:57 » 

зачем столько сложностей, у указателя на член класса такой нечитабельный синтаксис ))
Я бы просто сделал статическую функцию с первым параметром - указателем на объект A

указатели на статические функции легко поддаются дрессировке

Добавлено через 1 минуту и 15 секунд:
кстати! Что значит "не работает" - что под этим подразумевается ?
« Последнее редактирование: 01-12-2010 17:58 от Алексей1153 » Записан

The Nameless One
Помогающий

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

« Ответ #2 : 01-12-2010 17:58 » 

Да, статические ф-ии решают, но вот очень надо узнать, как вызвать в случае указателя на нестатическую?

Насчет "не работает" - извиняюсь, не уточнил сразу.
Компилятор ругается на "pf" как на неопределённый идентификатор.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 01-12-2010 18:05 » 

так операторы доступа:
->.
->*

а точка-звёздочка вроде нет такого Улыбаюсь Если не путаю, конечно. Не пользовался ни разу, если честно и не понимаю
Записан

The Nameless One
Помогающий

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

« Ответ #4 : 01-12-2010 18:07 » 

да, во второй попытке я ошибся, там ((&a)->*pf)();

Не работает все равно.

Добавлено через 1 минуту и 48 секунд:
Ну почему (this->*pf)(); компилируется внутри класса, а ((&a)->*pf)(); "снаружи" не компилируется и вообще никак?
« Последнее редактирование: 01-12-2010 18:09 от The Nameless One » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #5 : 01-12-2010 18:12 » 

Возможно pf не public.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 01-12-2010 18:12 » 

The Nameless One, если хочется, чтоб работало уже сейчас - примени статические методы , а если это всё из спортивного интереса, то можно дальше копаться Ага

Ты пишешь:
Цитата
//внутри самого класса могу вызвать без проблем
(this->*pf)();
а реально в рантайме это работает ? Или рушится ?
Записан

The Nameless One
Помогающий

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

« Ответ #7 : 01-12-2010 18:22 » 

RXL, точно public Улыбаюсь

Алексей1153++, вариант (this->*pf)(); прекрасно работает в рантайме, главное не забыть направить указатель на нужную ф-ию перед первым вызовом.
Записан
The Nameless One
Помогающий

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

« Ответ #8 : 02-12-2010 07:34 » 

Нашел решение.
Надо вызывать так:
Код:
(a.*(a.pf))();

Жутко выглядит, зато все работает))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 02-12-2010 08:41 » 

а так по идее тоже должно

(a.*A::pf)();

Записан

The Nameless One
Помогающий

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

« Ответ #10 : 02-12-2010 09:00 » 

Не, так уже не будет.
pf  - это же член класса. Поэтому сначала его надо извлечь, а затем уже применять вызов.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 02-12-2010 10:12 » 

ну да, туплю. Это если бы он статический был

Добавлено через 43 секунды:
ну, по сути - то же самое получается, что и со статическими функциями. Только выглядит страшнее ))
« Последнее редактирование: 02-12-2010 10:13 от Алексей1153 » Записан

Dimka
Деятель
Команда клуба

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

« Ответ #12 : 02-12-2010 12:33 » 

Можно написать вспомогательный метод:
Код: (C++)
class A {
// ...
  void call() { (this->*pf)(); }
};
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
The Nameless One
Помогающий

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

« Ответ #13 : 02-12-2010 17:02 » 

Dimka, именно так сначала и сделал. )
Записан
npak
Команда клуба

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

« Ответ #14 : 03-12-2010 14:22 » new

Нашел решение.
Надо вызывать так:
Код:
(a.*(a.pf))();

Жутко выглядит, зато все работает))
Выглядит так, как должно выглядеть.
a.pf - доступ к полю pf объекта a - результат выражения есть значение типа int(A::*)()
Код:
typedef int(A::*AFUNCPTR)();
AFUNCPTR x = a.pf;
int res = (a.*x)();

(a.*pf)();  не работает, так как в выражени используется отсутствующая глобальная переменная с именем pf.
« Последнее редактирование: 03-12-2010 14:24 от npak » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines