![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
DeadProger |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 30.12.2004 Где: The Earth Репутация: нет Всего: нет |
Есть некий класс TheClass ; В классе есть указатель на функцию: void (*pfunc)(void), и есть некая функция этого класса void some_func(void); Проблема в том, что нужно этому указателю присвоить адрес этой функции, а компилятор возмущается, и
в ответ на pfunc=some_func; пишет примерно следующее: cannot convert from 'void (__thiscall TheClass::*)(void )' to 'void (__cdecl *)(void)' Как можно это обойти? Хелп плиз |
|||
|
||||
Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
DeadProger
Код дай! Компилятор пишет что не может преобразовать -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
|||
|
||||
kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
pfunc=some_func;
А где ты это вызываешь? Если вне класса, тогда нужно так:
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
DeadProger |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 30.12.2004 Где: The Earth Репутация: нет Всего: нет |
Сам код сильно громоздкий, так что вот псевдо:
И ошибка, которую он вызывает: error C2440: '=' : cannot convert from 'void (__thiscall TheClass::*)(void)' to 'void (__cdecl *)(void)' |
|||
|
||||
jorkug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 21.3.2005 Репутация: нет Всего: 1 |
Может так:?
|
|||
|
||||
kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Не работает...
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
Mayk |
|
||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Функция должна быть статической.
Вы думаете что ей ничего не передается в качестве параметров, т.к. написано void somefunc(void)? Но С++ придерживается иного мнения на этот счет. this. Он тоже является ОБЫЧНЫМ параметром. Он даже не всегда заметен, но согласитесь, что
это то же самое, что и
(подразумевается, что bar не статическая переменная) Дизассемблируйте любую программу и увидите, что первый параметр любой функции класса (это последний параметр, пихаемый в стек) является указателем на сам класс, если, конечно, компиляторы не были сильно умны, чтобы понять ненужность this в некоторых случаях. Однако, someFunc в исходной задачи это не просто функция. Это член класса(метод класса, если хотите). И получается этот метод вот так:
А вызывается вообще зверски:
По-моему легче объявить функцию статической. Если нужны данные, то добавить явный аргумент this (лично мне нравится имя self: так назывался текущий объект в QuakeC)
Кстати, важно заметить то, что если some_func определена как функция класса(как в примере), то она имеет доступ к закрытым/private данным этого класса, в отличии от функции объявленной вне класса. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||
|
|||||||||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
DeadProger |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 30.12.2004 Где: The Earth Репутация: нет Всего: нет |
Vyacheslav Тогда возникает другая проблема:
как теперь вызвать функцию через этот указатель? Компилер позволяет использовать указатель void (TheClass::*pfunc)(void) только как часть данных: TheClass *obj=new TheClass; obj->Init(); obj->pfunc();//Ошибка: term doesn't evaluate to the function obj->pfunc;//Нет ошибки |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
DeadProger
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
DeadProger |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 30.12.2004 Где: The Earth Репутация: нет Всего: нет |
Void
error C2065: 'pfunc' : undeclared identifier error C2297: '->*' : illegal, right operand has type 'int' |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
DeadProger
Весь код в студию. Вот так оно используется:
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
DeadProger |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 30.12.2004 Где: The Earth Репутация: нет Всего: нет |
Пасиба
|
|||
|
||||
Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Я сейчас обижусь и уйду в монастырь молить Бьярна чтобы мои ответы читали -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Mayk А обижаться нечего. Большинство ваших ответов представляют обширные по объему декларации общеизвестных истин, из которых довольно трудно найти ответ на вопрос. Например, я прочитав ваше вступление про скрытый параметр this и про то, что лучше использовать статические методы, тоже совершенно пропустил то, что могло бы быть с натяжкой принято за ответ. Поэтому и дал свой вариант, без сентенций. И он, как оказалось, был более доходчив
![]() -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |