powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на метод объекта
11 сообщений из 11, страница 1 из 1
Указатель на метод объекта
    #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
Указатель на метод объекта
    #32793833
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй так что ли
Код: plaintext
1.
f=&(ObjectA::f);
...
Рейтинг: 0 / 0
Указатель на метод объекта
    #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
Указатель на метод объекта
    #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
Указатель на метод объекта
    #32795136
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем, кстати? Может есть другой путь решения проблемы.
Я как-то однажды тоже мучался вопросом получения указателя на метод класса, потом всё решил иным способом
...
Рейтинг: 0 / 0
Указатель на метод объекта
    #32795377
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА зачем, кстати? Может есть другой путь решения проблемы.
Я как-то однажды тоже мучался вопросом получения указателя на метод класса, потом всё решил иным способом

Проблема в общем такая:имеется некоторый класс, в котором имеется некая очередь, состоящая (как мне хотелось) из:
{указатель на объект;указатель на метод объекта},{...},...
При обработке очереди необходимо вызвать метод данного объекта.Объекты Элементов очереди могут быть произвольных типов (классов).Вызываемый метод имеет некоторый определенный шаблон (возвращаемое значение, список параметров).
Может, действительно, что-то перемудрил...
...
Рейтинг: 0 / 0
Указатель на метод объекта
    #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
Указатель на метод объекта
    #32796721
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и если нужно готовое решение

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


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