Показать полную графическую версию : Ф-ия потока - член класса
Мне нужно, чтобы конструктор объекта создавал новый поток. При этом, функция потока также должна быть методом этого объекта. Казалось бы - нормальные требования. Но у меня возникает проблема, которую я не знаю как решить. Проблема заключается в следующем: третий аргумент функции __beginthreadex имеет тип void(__stdcall*) (void*), но если функция потока определена как метод класса, то указатель на неё будет иметь вид void(__stdcall Bug:: *) (void *).
Расскажите пожалуйста как проблему решить (красиво)???
Я пытался сделать функцию потока friend'ом, чтобы "вытащить" её в глобальную область видимости, но она, естественно использует переменные и другие методы класса, при попытке вызвать функцию-метод с помощью Bug::Chase() (например) происходит следующая ругань: 'Bug::Chase' : illegal call of non-static member function. See declaration of 'Chase'
Дело в том, что я совсем новичок и разобраться самому очень тяжело.
Поможите, чем можите! Буду благодарен.
Dread Knight
06-03-2003, 04:52
Если уж юзать friend-овую функцию, то, поскольку она не в классе, а глобальная, то можно глобально определить экземпляр этого класса, а потом его и юзать в этой функции
З.Ы. - я пока тоже не профи, так что просьба не пинать ногами, а посоветовать, как лучше, если мой подход "не очень хороший"
vasketsov
06-03-2003, 07:39
Sharkky
так тебе ж все написали:
illegal call of non-static member function
Надо сделать ее статической (в смысле класса, чтоб не перепутали, а то static-ов уж чересчур много :) )
Sharkky
Примерно так:class Sharky
{
* *//...
* *Sharky()
* *{
* * * * __beginthreadex(/*не помню какие параметры */, thread_starter, /* ... */);
* *}
* *// ...
* *static void thread_starter(void * obj)
* *{
* * * * static_cast<Sharky*>(obj)->thread();
* *}
* *// Метод, который запускается в потоке.
* *void thread()
* *{
* *}
}
vasketsov
06-03-2003, 21:35
Sharkky
Еще, если this передать, можно и без cast-а обойтись.
И к тому же из статических функций можно вызывать нестатические, несмотря на то, что стандарт по этому поводу по-моему ничего определенного не говорит.
vasketsov
И к тому же из статических функций можно вызывать нестатические, несмотря на то, что стандарт по этому поводу по-моему ничего определенного не говорит.
Как?
vasketsov
07-03-2003, 20:53
К чему именно относится "как" из цитаты?
vasketsov
Как вызвать из статичесской функции класса нестатическую? Если подразумевается, что у нас есть указатель на объект, то чем это будет отличаться от "обычного" вызова метода "обычной" функцией, и почему стандарт об этом ничего не говорит?
vasketsov
08-03-2003, 09:06
ivank
Я ничего не видел об этом в стандартах, может и проглядел в свое время.
Но это работает правильно.
Условно.
X::nonstatic
{
}
X::static
{
return nonstatic;
}
vasketsov
Вообще-то тогда какой-то бред получается. Если функция не статическая, то она обращается к полям объекта. А если она обращается к полям объекта, то нужно иметь объект аки указатель this. А откуда ему взяться в статической функции?
vasketsov
10-03-2003, 11:52
ivank
Собственно, ты и озвучил главную проблему этого бреда.
Но вот компилятор как-то справляется.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.