C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Указатель на функцию, Указатель на функцию в аргументах фунции
Virus
Отправлено: 10.06.2006, 16:08


Ученик-кочегар

Группа: Участник
Сообщений: 17



Объясняю ситуацию:
Есть два класса — FRM1 (форма) и С2 (просто класс).
В форме имеются две (необходимых для рассмотрения) функции — ff1 и ff2.
В классе — одна функция — cf1
CODE

void FRM1::ff1(TObject* Sender)
{
C2 cls;
cls.cf1(ff2);
}
void FRM1::ff2(int i)
{
// ...
}

//...

void C2::cf1(void (* f)(int i))
{
// ...
int i=some_func(i);
// ...
f(i);
// ...
}

Теперь проблема:
При линковке выдвётся ошибка:
E2034 Cannot convert 'void (* (_closure )(int))(int)' to 'void (*)(int)'
и
E2342 Type mismatch in parameter 'f' (wanted 'void (*)(int)', got 'void')
на строку вызова функции cf1 в ff1.

Проблем не возникает, если функции находятся в одном классе или вообще не в классах.

P.S. Все эти функции PUBLIC.
xTrim
Отправлено: 10.06.2006, 19:59


Машинист паровоза

Группа: Участник
Сообщений: 208



CODE

void C2::cf1(void (__closure* f)(int i))
{
smile.gif

Отредактировано xTrim — 10/06/2006, 23:00
ShibaOn
Отправлено: 01.07.2006, 15:56


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Насколько я знаю, имена функции-членов классов должны употребляться либо со скобками Пр: ff2() — вызов, либо с оператором взятия адреса Пр: &ff2, в то время, как взятие адреса глобальных функции происходит без знака амперсанда. Не знаю зачем было введено такое правило, но видимо это необходимость, так что попробуй:

CODE

void FRM1::ff1(TObject* Sender)
{
C2 cls;
cls.cf1(&ff2);
}

Вернуться в Вопросы программирования в C++Builder