Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на метод объекта / 11 сообщений из 11, страница 1 из 1
22.11.2004, 12:41
    #32793802
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
Имеется некоторый объект некоторого класса.
Необходимо получить указатель на метод (функцию) данного объекта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class ClassA
{
 ...
 public:
   void func(int n);
 ...
}

ClassA ObjectA;
 // по аналогии с указателями на функции тупо пытаюсь сделать следующее:
void (*f)(int n); 
f=&(ObjectA.f);
//компилятор ругается, что нельзя получить адрес виртуальной функции
Можно ли это сделать (получить адрес метода) или нет?
...
Рейтинг: 0 / 0
22.11.2004, 12:56
    #32793833
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
попробуй так что ли
Код: plaintext
1.
f=&(ObjectA::f);
...
Рейтинг: 0 / 0
22.11.2004, 16:21
    #32794504
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
Можно, только тип указателя на функцию-член класса это совсем не одно и тоже, что указатель на обычную функцию. В данном случае:

Код: plaintext
1.
2.
3.
4.
ClassA foo;
// определяем адрес функции-члена класса
void (ClassA::*mem_func_ptr)(int) = &ClassA::func;
// вызываем через указатель фунцию-член класса
(foo.*ptr)( 10 );

Как видите, чтобы осуществить вызов функции-члена класса одного указателя не достаточно, а еще необходим объект, в контексте которого и будет выполняться тело функции - это важно! Другими словами, любая функция-член принимает неявный параметр this, поэтому указатель на функцию-член func не может быть приведет к void (*f)(int).
...
Рейтинг: 0 / 0
23.11.2004, 07:10
    #32795128
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
Анатолий ШироковМожно, только тип указателя на функцию-член класса это совсем не одно и тоже, что указатель на обычную функцию. В данном случае:

Код: plaintext
1.
2.
3.
4.
ClassA foo;
// определяем адрес функции-члена класса
void (ClassA::*mem_func_ptr)(int) = &ClassA::func;
// вызываем через указатель фунцию-член класса
(foo.*ptr)( 10 );

Как видите, чтобы осуществить вызов функции-члена класса одного указателя не достаточно, а еще необходим объект, в контексте которого и будет выполняться тело функции - это важно! Другими словами, любая функция-член принимает неявный параметр this, поэтому указатель на функцию-член func не может быть приведет к void (*f)(int).

Все хорошо, но от этого не легче: нужен указатель (без применения объекта класса), по которому можно вызвать метод.
...
Рейтинг: 0 / 0
23.11.2004, 07:20
    #32795136
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
А зачем, кстати? Может есть другой путь решения проблемы.
Я как-то однажды тоже мучался вопросом получения указателя на метод класса, потом всё решил иным способом
...
Рейтинг: 0 / 0
23.11.2004, 10:44
    #32795377
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
CEMbА зачем, кстати? Может есть другой путь решения проблемы.
Я как-то однажды тоже мучался вопросом получения указателя на метод класса, потом всё решил иным способом

Проблема в общем такая:имеется некоторый класс, в котором имеется некая очередь, состоящая (как мне хотелось) из:
{указатель на объект;указатель на метод объекта},{...},...
При обработке очереди необходимо вызвать метод данного объекта.Объекты Элементов очереди могут быть произвольных типов (классов).Вызываемый метод имеет некоторый определенный шаблон (возвращаемое значение, список параметров).
Может, действительно, что-то перемудрил...
...
Рейтинг: 0 / 0
23.11.2004, 12:27
    #32795647
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
#include <memory>			// std::auto_ptr
#include <functional>		// std::mem_fun1, std::bind2nd
#include <algorithm>		// std::for_each, std::transform
#include <iostream>			// std::cout

class handler
{
public:
     virtual ~handler() {}

     // notify - тот самый шаблон
     virtual int notify(int) =  0 ;
};

template<typename T>
class concrete_handler_t : public handler
{
      typedef int (T::*member_type)(int);

      T*object;
      member_type member;
public:
      concrete_handler_t(T*object, member_type member) : object(object), member(member) {}
      // переопределяем 
      int notify(int v)
      {
		  return (object->*member)(v);
      }
};

template<typename T>
std::auto_ptr<handler> make_handler(T *object, int (T::*member)(int))
{
     return std::auto_ptr<handler>(new concrete_handler_t<T>(object, member));
}


struct foo
{
	int func1(int v)
	{
		std::cout << "call foo::func1 with " << v << '\n';
		return v;
	}
};

struct boo
{
	int func1(int v)
	{
		std::cout << "call boo::func1 with " << v << '\n';
		return v;
	}
	int func2(int v)
	{
		std::cout << "call boo::func2 with " << v << '\n';
		return v;
	}
};

struct delete_object
{
	template<typename T>
	T* operator()(T *ptr)
	{
		delete ptr;
		return  0 ;
	}
};

int main(int argc, char *argv[])
{
	// фиктивный объект класс foo
	foo f;
	// фиктивный объект класс boo
	boo b;
	// очередь
	std::vector<handler*> arr;

	// ставим в очередь объекты из разных иерархий
	arr.push_back(make_handler(&f, &foo::func1).release());
	arr.push_back(make_handler(&b, &boo::func2).release());
	arr.push_back(make_handler(&b, &boo::func1).release());

	// оповещаем о наступлении события 120 все объекты очереди
	std::for_each(arr.begin(), arr.end(), std::bind2nd(std::mem_fun1(&handler::notify),  120 ));

	// удаляем из памяти элементы очереди
	std::transform(arr.begin(), arr.end(), arr.begin(), delete_object());

	return  0 ;
}
...
Рейтинг: 0 / 0
23.11.2004, 17:36
    #32796721
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
Ну и если нужно готовое решение

http://www.boost.org/libs/bind/mem_fn.html
...
Рейтинг: 0 / 0
23.11.2004, 19:55
    #32796957
Указатель на метод объекта
Я извиняюсь, это все где происходит? Если в билдере, то там для этих целей как раз есть __closure, который и позволяет получить указатель на метод класса без указания самого класса.
...
Рейтинг: 0 / 0
24.11.2004, 07:32
    #32797129
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
СEMbА зачем, кстати?
Вот как важно задать нужный вопрос в нужном месте :)
...
Рейтинг: 0 / 0
24.11.2004, 09:57
    #32797284
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на метод объекта
Спасибо большое, буду пробовать!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на метод объекта / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]