Показать сообщение отдельно
Старый 03.07.2011, 02:09   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Указатели на функции.

В общем случае - приходилось работать с данным "явлением". Однако сейчас, я столкнулся с "указателем на функцию-член класса".
Погуглил и вот что выудил (спешу поделиться с общественностью):
В моей программе (поток нафиг не по теме, но что-то придумать иного семпла, кроме как актуального кода не могу):
класс MyCl* сожержит структуру MyStr (структура с параметрами потока, которым класс управляет); в структуре содержатся данные о том, какую функцию из родительского экземпляра класса MyCl поток (дескриптор которого является компонентом структуры MyStr, входящей в состав класса MyCl, и получающий экземпляр структуры MyStr как бестиповой указатель в момент создания) должен запускать (при определённом стечении обстоятельств). Т.к. хотелось иметь универсальный инструмент и конфигурировать его в момент задания MyStr, пришлось отказаться от явного обращения к функции по имени.
Структура:
class MyCl;
struct MyStr{
HANDLE Thread;
THREAD_CONTROL Control;
MyCl *ParentInterface;
void (MyCl::*FunctionPtr)(WORD,void*,void*);
};
Класс (func1,func2,func3 - большое разнообразие возможных функций):
class MyCl{
private:
MyStr ControlThread;
void func1(WORD,void*,void*);
void func2(WORD,void*,void*);
void func3(WORD,void*,void*);
public:
MyCl();
~MyCl();
}
Функция, которую выполняет поток
DWORD WINAPI ThreadFunction(PVOID);
DWORD WINAPI ThreadFunction(PVOID Param){
	MyStr *PC=(MyStr*)Param;
	while (true){
		(PC->ParentInterface->*(PC->FunctionPtr))(0,0,0);
		Sleep(5000);
		if(PC->Control==TH_STOP)break;
	}
	return 0;
}
Синим выделена, выносящая мозг конструкция, являющаяся вызовом функции, по указателю FunctionPtr, из экземпляра ParentInterface.
Как получить адрес функции:
ControlThread.FunctionPtr=&MyCl::func1;
В ParentInterface запихивается указатель на родительский экземпляр MyCl.
Меняя эту строку, можно программировать поведение потока, не нагромождая конструкции из всех возможных case

*-имена вымышлены, куски кода выкинуты для упрощения пониамния; в действительности код грамотно разбит на объявление и реализацию.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
.Squid (03.07.2011), maxturbo (03.07.2011), moka (03.07.2011)