Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Проблемы с указателем на функцию |
Автор: DeadProger 25.5.2005, 21:57 |
Есть некий класс TheClass ; В классе есть указатель на функцию: void (*pfunc)(void), и есть некая функция этого класса void some_func(void); Проблема в том, что нужно этому указателю присвоить адрес этой функции, а компилятор возмущается, и в ответ на pfunc=some_func; пишет примерно следующее: cannot convert from 'void (__thiscall TheClass::*)(void )' to 'void (__cdecl *)(void)' Как можно это обойти? Хелп плиз |
Автор: Coocky 25.5.2005, 22:03 |
DeadProger Код дай! Компилятор пишет что не может преобразовать |
Автор: kometa_triatlon 25.5.2005, 22:11 | ||
pfunc=some_func; А где ты это вызываешь? Если вне класса, тогда нужно так:
|
Автор: DeadProger 25.5.2005, 22:15 | ||
Сам код сильно громоздкий, так что вот псевдо:
И ошибка, которую он вызывает: error C2440: '=' : cannot convert from 'void (__thiscall TheClass::*)(void)' to 'void (__cdecl *)(void)' |
Автор: jorkug 26.5.2005, 04:09 | ||
Может так:?
|
Автор: kometa_triatlon 26.5.2005, 04:47 |
Не работает... |
Автор: Mayk 26.5.2005, 06:20 | ||||||||||
Функция должна быть статической. Вы думаете что ей ничего не передается в качестве параметров, т.к. написано void somefunc(void)? Но С++ придерживается иного мнения на этот счет. this. Он тоже является ОБЫЧНЫМ параметром. Он даже не всегда заметен, но согласитесь, что
это то же самое, что и
(подразумевается, что bar не статическая переменная) Дизассемблируйте любую программу и увидите, что первый параметр любой функции класса (это последний параметр, пихаемый в стек) является указателем на сам класс, если, конечно, компиляторы не были сильно умны, чтобы понять ненужность this в некоторых случаях. Однако, someFunc в исходной задачи это не просто функция. Это член класса(метод класса, если хотите). И получается этот метод вот так:
А вызывается вообще зверски:
По-моему легче объявить функцию статической. Если нужны данные, то добавить явный аргумент this (лично мне нравится имя self: так назывался текущий объект в QuakeC)
Кстати, важно заметить то, что если some_func определена как функция класса(как в примере), то она имеет доступ к закрытым/private данным этого класса, в отличии от функции объявленной вне класса. |
Автор: Vyacheslav 26.5.2005, 09:16 | ||
|
Автор: DeadProger 26.5.2005, 21:23 |
Vyacheslav Тогда возникает другая проблема: как теперь вызвать функцию через этот указатель? Компилер позволяет использовать указатель void (TheClass::*pfunc)(void) только как часть данных: TheClass *obj=new TheClass; obj->Init(); obj->pfunc();//Ошибка: term doesn't evaluate to the function obj->pfunc;//Нет ошибки |
Автор: Void 26.5.2005, 21:40 | ||
DeadProger
|
Автор: DeadProger 26.5.2005, 21:44 |
Void error C2065: 'pfunc' : undeclared identifier error C2297: '->*' : illegal, right operand has type 'int' |
Автор: Void 26.5.2005, 21:55 | ||
DeadProger Весь код в студию. Вот так оно используется:
|
Автор: DeadProger 26.5.2005, 22:02 |
Пасиба |
Автор: Mayk 27.5.2005, 04:51 | ||||||
Я сейчас обижусь и уйду в монастырь молить Бьярна чтобы мои ответы читали |
Автор: Vyacheslav 27.5.2005, 09:11 |
Mayk А обижаться нечего. Большинство ваших ответов представляют обширные по объему декларации общеизвестных истин, из которых довольно трудно найти ответ на вопрос. Например, я прочитав ваше вступление про скрытый параметр this и про то, что лучше использовать статические методы, тоже совершенно пропустил то, что могло бы быть с натяжкой принято за ответ. Поэтому и дал свой вариант, без сентенций. И он, как оказалось, был более доходчив ![]() |