Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Ф-ия потока - член класса (http://forum.oszone.net/showthread.php?t=30626)

Sharkky 05-03-2003 23:18 209394

Мне нужно, чтобы конструктор объекта создавал новый поток. При этом, функция потока также должна быть методом этого объекта. Казалось бы - нормальные требования. Но у меня возникает проблема, которую я не знаю как решить. Проблема заключается в следующем: третий аргумент функции __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 209395

Если уж юзать friend-овую функцию, то, поскольку она не в классе, а глобальная, то можно глобально определить экземпляр этого класса, а потом его и юзать в этой функции

З.Ы. - я пока тоже не профи, так что просьба не пинать ногами, а посоветовать, как лучше, если мой подход "не очень хороший"

vasketsov 06-03-2003 07:39 209396

Sharkky
так тебе ж все написали:
Цитата:

illegal call of non-static member function
Надо сделать ее статической (в смысле класса, чтоб не перепутали, а то static-ов уж чересчур много :) )

ivank 06-03-2003 07:47 209397

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 209398

Sharkky
Еще, если this передать, можно и без cast-а обойтись.
И к тому же из статических функций можно вызывать нестатические, несмотря на то, что стандарт по этому поводу по-моему ничего определенного не говорит.

ivank 07-03-2003 18:39 209399

vasketsov
Цитата:

И к тому же из статических функций можно вызывать нестатические, несмотря на то, что стандарт по этому поводу по-моему ничего определенного не говорит.
Как?

vasketsov 07-03-2003 20:53 209400

К чему именно относится "как" из цитаты?

ivank 07-03-2003 22:03 209401

vasketsov
Как вызвать из статичесской функции класса нестатическую? Если подразумевается, что у нас есть указатель на объект, то чем это будет отличаться от "обычного" вызова метода "обычной" функцией, и почему стандарт об этом ничего не говорит?

vasketsov 08-03-2003 09:06 209402

ivank
Я ничего не видел об этом в стандартах, может и проглядел в свое время.

Но это работает правильно.
Условно.

X::nonstatic
{
}

X::static
{
 return nonstatic;
}


ivank 09-03-2003 12:47 209403

vasketsov
Вообще-то тогда какой-то бред получается. Если функция не статическая, то она обращается к полям объекта. А если она обращается к полям объекта, то нужно иметь объект аки указатель this. А откуда ему взяться в статической функции?

vasketsov 10-03-2003 11:52 209404

ivank
Собственно, ты и озвучил главную проблему этого бреда.
Но вот компилятор как-то справляется.


Время: 02:50.

Время: 02:50.
© OSzone.net 2001-