Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > приведения указателя на метод класса к указателю


Автор: wpp 17.11.2005, 21:54
приведения указателя на метод класса к указателю на функцию, возможно ли? smile

Автор: Void 17.11.2005, 22:01
Иногда возможно через reinterpret_cast. Практической пользы ноль.

Автор: wpp 18.11.2005, 11:43
Ну а если есть функция (С), которая в качестве параметра принимает указатель на функцию, а мне надо впарить ей указатель на метод класса?

Автор: Neitron 18.11.2005, 11:53
wpp
Длина указателя на ф-ции нестатическая.

Автор: wpp 18.11.2005, 12:10
Neitron Для меня, к сожалению, Ваше высказывание крайне загадочно... Нельзя ли подоходчивей?

Автор: Neitron 18.11.2005, 12:39
wpp
Чтобы передать указатель на ф-цию, нужно знать его точный размер.
Длина указателя на разного типа ф-ции разная. Это конечно не факт, но она не обязана быть одинаковой.
Если работаешь в Билдере, можешь воспользоваться методом __closure с помощью которого можно создать тип указателя на функцию член.
Нечто вроде
Код

typedef void __fastcall (__closure *BFunc)();

Автор: SergeCpp 18.11.2005, 12:41
Можно, только если это статический метод класса...

Если не статический, то http://ders.stml.net/cpp/cpp3comm/cpp3comm.html#475

Автор: Earnest 18.11.2005, 19:10
wpp дело не только в размере указателя,
даже если он 4 байта, как у простых классов MSVC, передать-то можно, а вот при вызове что ты получишь? большой ОЙ.
У тебя 2 варианта:
Если код, которому нужно передать указатель на функцию, можно переписать - перепиши - либо добавь дополнительный параметр (указатель на объект) + статические оболочки для методов класса. А может там уже есть дополнительный параметр?
Либо вообще перепроектируй, используя что-то вроде делегатов. Простую реализацию можешь сам написать, либо возьми boost::function (а может и еще что есть).

Если код чужой или переписывать его никак невозможно, то, если нет дополнительного параметра, через который можно передать указатель на объект, остаетcя только этот указатель куда-нибудь запихивать (в статическую переменную напр.). Но это очень негибкий путь... Ну или в зависимости от задачи искать пути.

Автор: wpp 19.11.2005, 13:02
Мда... С++ действительно достоин замены...
Код

SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);

В ней я изменения вносить не хочу.

Мой метод:
Код

int SomeClass::function(void *arg);


Как передать второе первому smile? smile

Автор: Mayk 19.11.2005, 13:21
Объявляешь ф-цию статической.
Далее так
static someclass:function -> в первую легко передается
this -> передаешь через data
требуемый аргумент -> someclass::argument

Около того:

Код

class SomeClass
{
 static int func(void* _self){
   SomeClass* self =  (SomeClass*)_self;;
   self->processData(self->arg);
 }
 void*arg;
}

....


SomeClass* s = new SomeClass;
s->arg = findSomethingUseful();
SDL_CreateThread(&SomeClass::func,s);


Автор: np9mi7 19.11.2005, 14:35
Товарищи, указатель на метод - это вообще не тип (если исключить расширения языковые, типа __closure), так что это не возможно для ANSI C++

Автор: Mayk 19.11.2005, 14:46
Цитата(np9mi7 @ 19.11.2005, 18:35)
Товарищи, указатель на метод - это вообще не тип (если исключить расширения языковые, типа __closure), так что это не возможно для ANSI C++

Здрасьте. А что это такое?
Код

#include <stdio.h>
#include <stdlib.h>

struct hello{
        static int hello_counter;
        int a;
        hello(){a=hello_counter++;}
        void print(){printf("%d\n",a);}
        void print2(){printf("!%d\n",a);}
} ;
int hello::hello_counter=0;
int main()
{
        hello h;
        hello h2;
        void (hello::*fn)()=&hello::print;
        (h.*fn)();
        (h2.*fn)();
        fn = &hello::print2;
        (h.*fn)();
        (h2.*fn)();
}

Автор: np9mi7 19.11.2005, 15:06
Цитата
В языке С++ не существует типа для результата работы функций geronimo.*pActivity и geronimo->*pActivity. С обеими бинарными операциями всё в порядке. Они возвращают нечто, к чему можно непосредственно применить оператор вызова функции, но это "нечто" не имеет типа.
, Андрей Александреску, "Современное проектирование на С++", стр. 138.

Автор: Mayk 19.11.2005, 15:15
Цитата(np9mi7 @ 19.11.2005, 19:06)
geronimo->*pActivity.

эээ. А разве &Hello::print и geronimo->*pActivity имеют один и тот же тип?
Что такое pActivity - если не указатель на метод?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)