Потому как это разные типы указателей: один (формальный параметр) — это указатель на функцию, второй(фактический аргумент) — это указатель на член-функцию (это тоже прокатило бы, если б твоя функция-член была статической, но так как она у тебя non-static, то не прокатывает)
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Потому как это разные типы указателей: один (формальный параметр) — это указатель на функцию, второй(фактический аргумент) — это указатель на член-функцию (это тоже прокатило бы, если б твоя функция-член была статической, но так как она у тебя non-static, то не прокатывает)
Да, действительно. а как можно это сделать?
и еще одно:
если функция hello() перегружается то как вызвать ту, которую надо??
Здравствуйте, matros, Вы писали:
M>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>Потому как это разные типы указателей: один (формальный параметр) — это указатель на функцию, второй(фактический аргумент) — это указатель на член-функцию (это тоже прокатило бы, если б твоя функция-член была статической, но так как она у тебя non-static, то не прокатывает)
M>Да, действительно. а как можно это сделать?
M>и еще одно:
M>если функция hello() перегружается то как вызвать ту, которую надо??
т.е. как пределать ф-ю
Это я понял, я имел ввиду без static. никак?
M>>и еще одно:
M>>если функция hello() перегружается то как вызвать ту, которую надо?? L_L>Правильная функция будет выбрана по типу указателя
M>говорит такое: M>cannot convert parameter 1 from 'void (__thiscall MyClass::*)(const char *)' to 'void (__cdecl *)(const char *)' M>
Потому что
а) нужно внимательно читать текст программы, которую я привел
б) немного думать.
Вот ты вызываешь функцию по указателю:
(*fn)("me");
а ведь это — метод объекта(*) класса MyClass. Где здесь объект?
-------
*) метод объекта — выполняется в связке с объектом. obj.hello("me"); pObj->hello("me");
В отличии от статического метода — который выполняется без связки. MyClass::hello2("me");
Но, скажешь ты, ведь функция say_h(void(*)(const char*)) скомпилировалась, а ошибка ниже?
Разумеется.
Компилятор понимает, что в main() ты метод объекта пытаешься передать (и в дальнейшем использовать) как обычную функцию. Вот и дает тебе по пальцам.
Упрощая ситуацию, можно сказать: в метод объекта неявно передается указатель на объект. Т.е. тип твоего метода hello() будет примерно такой: void(*)(MyClass*, const char*).
Согласись, это не то же самое, что void(*)(const char*).
Это ты недосмотрел.
Посмотри свой текст, может и ты ошибся? нет. просто static ее нужно было сделать, как я понимаю, именно для возможности вызова без создания объекта, да?
я так думаю.
но есть еще вопрос:
а что если ф-я hello() перезагружена??
class MyClass
{
public:
static void hello(const char *ch);
static void hello(const int);
};
void MyClass::hello(const char *ch)
{
cout<<"hello from :"<< ch << endl;
}
void MyClass::hello(const int var)
{
cout<<"variable : "<< var << endl;
}
как написать ф-ю
void say_h(???????)
{
(*fn)("me");
}
int main()
{
say_h(&MyClass::hello);
}