|
24.08.2011, 23:56
|
#1
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Укозатель на метод класса
Имеится некая библиотечная функция, которая принимает в параметры укозатель на функцию:
libfunc(int (*fn)(void *));
она вызывается из метода класса MyClass::init, и принемать должна MyClass::someFunc.
Повсякому пробывал - компилятор ругается.
Как?
upd: если не использовать классы, то всё ок.
|
(Offline)
|
|
25.08.2011, 00:02
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Укозатель на метод класса
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
25.08.2011, 00:11
|
#3
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Укозатель на метод класса
видел. читал. непомогает((
SDL_CreateThread(&net::thread, &timeout);
src/net.cpp:62: error: cannot convert ‘int (net:)(void*)’ to ‘int (*)(void*)’ for argument ‘1’ to ‘SDL_Thread* SDL_CreateThread(int (*)(void*), void*)’
|
|
(Offline)
|
|
25.08.2011, 00:13
|
#4
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Укозатель на метод класса
код, где вызваешь покажи
и без смайлов
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
25.08.2011, 00:15
|
#5
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Укозатель на метод класса
кусок файла net.cpp
int net::thread(void *data) { int timeout = *((int*)data); ENetEvent event; while(enet_host_service(client, &event, timeout)) { if(event.type == ENET_EVENT_TYPE_RECEIVE) { int size; bytes2int(&(event.packet->data[0]), size); for(int i = 0; i < size; i++) { pair < int, int > p; bytes2int(&(event.packet->data[sizeof(int)*(i*2+1)]), p.first); bytes2int(&(event.packet->data[sizeof(int)*(i*2+2)]), p.second); SDL_mutexP(lock); v.push_back(p); SDL_mutexV(lock); } } enet_packet_destroy(event.packet); } return 0; } int net::connect(string host, int port, int timeout) { enet_address_set_host(&address, host.c_str()); address.port = port; peer = enet_host_connect(client, &address, 2); ENetEvent event; if(enet_host_service(client, &event, timeout) > 0 && event.type == ENET_EVENT_TYPE_CONNECT) { cout << "Connection succeeded" << endl; } else { enet_peer_reset(peer); cerr << "Connection to " << host << ":" << port << " failed" << endl; return 1; } SDL_CreateThread(&net::thread, &timeout); return 0; }
ps: ошибок больше нет, только эта.
|
(Offline)
|
|
25.08.2011, 00:17
|
#6
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Укозатель на метод класса
скорее всего трабла в том, что функция требует в качве параметра глобальную (или статическую) функцию, а ты даёшь нестатический метод.
|
(Offline)
|
|
25.08.2011, 00:19
|
#7
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Укозатель на метод класса
описание функции
все методы нестатические.
|
(Offline)
|
|
25.08.2011, 00:25
|
#8
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Укозатель на метод класса
сделал тупо приведение:
SDL_CreateThread((int(*)(void*))(&net::thread), &timeout);
и теперь вместо ошибки предупреждение))
буде тестить
|
(Offline)
|
|
25.08.2011, 11:35
|
#9
|
Нуждающийся
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений (для 15 пользователей)
|
Ответ: Укозатель на метод класса
вообще штатными средствами в си нельзя на нестатичный метод ссылку сделать
это возможно благодаря делегатам, которые есть в других языках, и которые сделал Александреску в си++ с помощью шаблонов, но таким способом, что уж лучше придумать как нибудь без делегатов
об этом написано в его книге, там он много всяких вкусностей, которых нету в си++, сделал с помощью шаблонов
|
(Offline)
|
|
25.08.2011, 11:46
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Укозатель на метод класса
делай метод статичным. подумай сам - у какого именно объекта должны вызваться функция, если у тебя их будет 42?
|
(Offline)
|
|
25.08.2011, 12:02
|
#11
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Укозатель на метод класса
Сообщение от HolyDel
делай метод статичным. подумай сам - у какого именно объекта должны вызваться функция, если у тебя их будет 42?
|
а если через укозатель this ?
|
(Offline)
|
|
25.08.2011, 12:14
|
#12
|
Нуждающийся
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений (для 15 пользователей)
|
Ответ: Укозатель на метод класса
так ведь этот this твоя библиотечная функция и не знает
просто ссылка на метод для всех обьектов одинакова, когда ты вызваешь метод для обьекта ему еще тайно от тебя передается указатель this
и просто так функции этот указатель не передать
и выхода два, либо как казал холидел статик, либо делегат, что в си++ изврат с садомазой))
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо genroelgvozo за это полезное сообщение:
|
|
25.08.2011, 15:45
|
#13
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Укозатель на метод класса
Сообщение от HolyDel
делай метод статичным. подумай сам - у какого именно объекта должны вызваться функция, если у тебя их будет 42?
|
Для вызова используются два указателя: на метод и на экземпляр класса. Я же уже писал: http://forum.boolean.name/showthread.php?t=15043
цель:
class MyCl{
private:
MyStr ControlThread;
void func1(WORD,void*,void*); //<---- хочу вызвать вот это
void func2(WORD,void*,void*);
void func3(WORD,void*,void*);
public:
MyCl();
~MyCl();
}
указтели:
MyCl *ParentInterface;
void (MyCl::*FunctionPtr)(WORD,void*,void*);
Получение адреса (? вообще костыльно выглядит - фактически по имеющимся данным [без указания конкретного экземпляра класса] можно восстановить только смещение до функции внутри класса, поэтому адрес, вероятно, относительно начала адреса экземпляра) метода (указатель на класс получается как обычно):
FunctionPtr=&MyCl::func1;
вызов (вызываю функцию с адресом FunctionPtr [здесь это func1] из экземпляра с адресом ParentInterface ):
(ParentInterface->*FunctionPtr)(0,0,0);
upd поправил код
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
Последний раз редактировалось impersonalis, 25.08.2011 в 21:18.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
25.08.2011, 20:10
|
#14
|
Нуждающийся
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений (для 15 пользователей)
|
Ответ: Укозатель на метод класса
этот код работает? или это с++0x уже? я просто новый стандарт не знаю
а то как бы это получаются делегаты через обычный указатель (я думал что в си такое невозможно )
вот статья на хабре как сделать простой делегат на си++ http://habrahabr.ru/blogs/cpp/78299/
UPD
У меня так не работает. Он говорит что функптр должен быть указатель на функцию, а если я его обьявляю как указатель на функцию, он пишет что он должен быть указатель на член))
|
(Offline)
|
|
25.08.2011, 21:08
|
#15
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Укозатель на метод класса
Да, код работает на MSVC++ 6.0 (откуда [год разработки 6-ой сутдии] можно сделать вывод, что это не с++0x).
Повторю ещё раз ссылку на руководство по указателям на функции http://www.newty.de/fpt/index.html
Сообщение от genroelgvozo
UPD
У меня так не работает. Он говорит что функптр должен быть указатель на функцию, а если я его обьявляю как указатель на функцию, он пишет что он должен быть указатель на член))
|
Неправильно скопировал, прошу извинить. Ошибка вот здесь (теперь правильно):
(ParentInterface->*FunctionPtr)(0,0,0);
К сожалению, проверить сейчас не могу, но пример составлен из рабочего кода.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:06.
|