Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> приведения указателя на метод класса к указателю 
:(
    Опции темы
wpp
Дата 17.11.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 25.5.2003

Репутация: нет
Всего: нет



приведения указателя на метод класса к указателю на функцию, возможно ли? smile
PM   Вверх
Void
Дата 17.11.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Иногда возможно через reinterpret_cast. Практической пользы ноль.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
wpp
Дата 18.11.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 25.5.2003

Репутация: нет
Всего: нет



Ну а если есть функция (С), которая в качестве параметра принимает указатель на функцию, а мне надо впарить ей указатель на метод класса?
PM   Вверх
Neitron
Дата 18.11.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



wpp
Длина указателя на ф-ции нестатическая.



--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
wpp
Дата 18.11.2005, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 25.5.2003

Репутация: нет
Всего: нет



Neitron Для меня, к сожалению, Ваше высказывание крайне загадочно... Нельзя ли подоходчивей?
PM   Вверх
Neitron
Дата 18.11.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



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

typedef void __fastcall (__closure *BFunc)();


Это сообщение отредактировал(а) Neitron - 18.11.2005, 12:41


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
SergeCpp
Дата 18.11.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Можно, только если это статический метод класса...

Если не статический, то читайте здесь


Это сообщение отредактировал(а) SergeCpp - 15.12.2006, 10:48
PM MAIL WWW ICQ   Вверх
Earnest
Дата 18.11.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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

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



--------------------
...
PM   Вверх
wpp
Дата 19.11.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 25.5.2003

Репутация: нет
Всего: нет



Мда... С++ действительно достоин замены...
Код

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

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

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

int SomeClass::function(void *arg);


Как передать второе первому smile? smile
PM   Вверх
Mayk
Дата 19.11.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Объявляешь ф-цию статической.
Далее так
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);




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
np9mi7
Дата 19.11.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



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


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Mayk
Дата 19.11.2005, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(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)();
}


Это сообщение отредактировал(а) Mayk - 19.11.2005, 14:47


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
np9mi7
  Дата 19.11.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



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

Это сообщение отредактировал(а) np9mi7 - 19.11.2005, 15:06


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Mayk
Дата 19.11.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(np9mi7 @ 19.11.2005, 19:06)
geronimo->*pActivity.

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.