Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание указателя на метод объекта 
:(
    Опции темы
viii
Дата 7.10.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Здравствуйте!

Вот хочу создать указатель на метод объекта
с тем чтобы передать его хранить а потом вызывать метод посредством этого указателя
PM MAIL   Вверх
MAKCim
Дата 7.10.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



smile
Код

class foo {
public:
    void some() {}
};

int main() {
    void (foo :: *pointer)() = &foo :: some;
    foo object;
    (object.*pointer)();
    return 0;
}

 

Это сообщение отредактировал(а) MAKCim - 7.10.2007, 13:20


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
viii
Дата 7.10.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



к сожалению, так не подходит, поскольку данный указатель передается в функцию
а функция "не знает" куда он указывает а только "знает" что это уазатель на другую функцию, которую необходимо вызвать

примерно так: 
Код

void do_nothing(void){;}

class foo{
    public:
         void do_nothing(void){;}
         void call_func(void (*action)(void)){
             (*action)();  
         }
}

foo c1,c2;

//Вот это работает
void (*func_ptr0)(void) = do_nothing;
c2.call_func(func_ptr0);

//А на нижеследующую строку компилятор ругается 
void (*func_ptr1)(void) = c1.do_nothing;
c2.call_func(func_ptr1);



при этом нельзя делать метод do_nothing статическим, поскольку, в реальной программе, ему необходим доступ к нестатическим свойствам и методам объекта
PM MAIL   Вверх
bsa
Дата 7.10.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Надо использовать что-то типа boost::bind.
PM   Вверх
Любитель
Дата 7.10.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Для вызова метода объекта надо ещё згать - для какого объекта вызывать smile Если ты хочешь вызывать для заранее известного объекта, то возможно что-то такое:
Код

void do_nothing(void){;}

class foo{
    public:
         void do_nothing(void){;}
         void call_func(boost::function<void ()> action){
             action();
         }
}

foo c1,c2;

boost::function<void ()> f1 = do_nothing;
c2.call_func(f1);

boost::function<void ()> f2 = boost::bind(&foo::do_nothing, &c1);
c2.call_func(f2);



--------------------
PM MAIL ICQ Skype   Вверх
Alek86
Дата 7.10.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



мож я чего не догоняю - тогда поправьте меня
но вроде функции-члены класса отличаются от обычных тем, что в них "нужно" передавать еще и this. а компилятор делает это сам.

как же можно вызвать функцию-член класса, если
Цитата(viii @  7.10.2007,  14:22 Найти цитируемый пост)
функция "не знает" куда он указывает а только "знает" что это уазатель на другую функцию, которую необходимо вызвать

??

Добавлено через 37 секунд
ЗЫ. скорее всего я просто перефразировал ответ Любителя smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
viii
Дата 7.10.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



мне бы это подошло
только компилятор ругается на строчку
Код

boost::function<void ()> action;

говорит:
Error:  kursak.cpp(27,11):Qualifier 'boost' is not a class or namespace name

а пользую я Borland C++ 5.02

Это сообщение отредактировал(а) viii - 7.10.2007, 16:19
PM MAIL   Вверх
Daevaorn
Дата 7.10.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(viii @  7.10.2007,  17:18 Найти цитируемый пост)
Error:  kursak.cpp(27,11):Qualifier 'boost' is not a class or namespace name

а пользую я Borland C++ 5.02

Тогда про этот вариант можешь забыть.
PM MAIL WWW   Вверх
viii
Дата 7.10.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



ну так, может быть, другой подскажете?
PM MAIL   Вверх
archimed7592
Дата 7.10.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alek86 @  7.10.2007,  15:14 Найти цитируемый пост)
как же можно вызвать функцию-член класса, если

Очень просто... Ты про биндеры ничего не слышал? smile


Цитата(viii @  7.10.2007,  16:40 Найти цитируемый пост)
ну так, может быть, другой подскажете? 

Ручками реализовывать(да, без шаблонов жить не просто smile). Полиморфизм тебе в помощь(паттерн Command).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Любитель
Дата 7.10.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(viii @  7.10.2007,  16:18 Найти цитируемый пост)
а пользую я Borland C++ 5.02

Цитата(Daevaorn @  7.10.2007,  16:31 Найти цитируемый пост)
Тогда про этот вариант можешь забыть.

Сомневаюсь, что полностью, но в целом буст должен ИМХО работать с этим компилером. С соответствующими воркэраундами smile


--------------------
PM MAIL ICQ Skype   Вверх
archimed7592
Дата 7.10.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Любитель @  7.10.2007,  18:21 Найти цитируемый пост)
с этим компилером

Этот компилер в курсе о существовании шаблонов? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Daevaorn
Дата 7.10.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(archimed7592 @  7.10.2007,  19:26 Найти цитируемый пост)
Этот компилер в курсе о существовании шаблонов? smile

знает, даже 4.5 вроде догадывается.
PM MAIL WWW   Вверх
bsa
Дата 7.10.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(archimed7592 @ 7.10.2007,  18:26)
Цитата(Любитель @  7.10.2007,  18:21 Найти цитируемый пост)
с этим компилером

Этот компилер в курсе о существовании шаблонов? smile

На счет буста не знаю, но STL там работает.
PM   Вверх
archimed7592
Дата 7.10.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Daevaorn @  7.10.2007,  19:12 Найти цитируемый пост)
знает, даже 4.5 вроде догадывается. 

Видимо только по наслышке, раз там даже boost::function не работает(с твоих слов) smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.