Форум программистов, компьютерный форум CyberForum.ru

Статический метод класса. Доступ к нестатическому объекту. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
12.05.2012, 14:48     Статический метод класса. Доступ к нестатическому объекту. #1
Существует класс
во время работы этот класс создает поток, который в качестве одного из аргументов принимает метод этого же класса.

файл класс.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Sort_2t_2tM : public Sort_2thread_Basic
{
protected:
    vector<int>::iterator IT1;
    vector<int>::iterator IT2;
    long elem_size1;
    long elem_size2;
 
static DWORD WINAPI Potok_Find(void *);
 
public:
    Sort_2t_2tM(vector<int> &);
 
void Sort();
 
 
};
файл класс.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sort_2t_2tM::Sort_2t_2tM(vector<int> &vec):Sort_2thread_Basic(vec)
{
 
}
 
void Sort_2t_2tM::Sort()
{
    long start = clock();
    half_sort();
    vector<int>::iterator p[3];
    p[0] = bi;
    p[1] = avei;
    p[2] = ei;
    HANDLE potok = CreateThread(NULL, 0, Sort_2t_2tM::Potok_Find, p, 0, NULL);
    vector<int> helper(size);
    WaitForSingleObject(potok,INFINITE);
}
 
DWORD Sort_2t_2tM::Potok_Find(void *param)
{
    vector<int>::iterator* p = static_cast<vector<int>::iterator *>(param);
    elem_size1 = 2; //СМОТРЕТЬ СЮДА!
    IT1 = p[0]; //И СЮДА
}
Как вы видите, я хочу, чтобы статический метод поменял значения нестатических полей - то есть ошибку.
Допустим, метод будет нестатическим, но как тогда вызвать его через
C++ (Qt)
1
HANDLE potok = CreateThread(NULL, 0, Sort_2t_2tM::Potok_Find, p, 0, NULL);
Ведь, если метод нестатический..то название этой функции - это не есть указатель на функцию..

Выхода вижу 2, но не знаю, как их реализовать
1.) Уверить компилятор, что мой статический метод будет вызваться только в уже созданном объекте
2.) Сделать вызов создания потока, аля
C++ (Qt)
1
HANDLE potok = CreateThread(NULL, 0, this->Potok_Find, p, 0, NULL);
если 2 вариант всё же возможен, то есть ли связанные с ним накладные расходы (по сравнению с вызовом статического метода)

Добавлено через 1 час 53 минуты
Хнык
Нужно всего-лишь правильно передать указатель на метод класса в CreateThread...
строчки
C++ (Qt)
1
2
DWORD (Sort_2thread_Basic::* ptr)(void *);
ptr = Sort_2thread_Basic::Potok_Sort;
не компилируются

Добавлено через 2 минуты
Зато компилируется так
C++ (Qt)
1
2
DWORD (WINAPI Sort_2thread_Basic::* ptr)(void *);
ptr = Sort_2thread_Basic::Potok_Sort;
Но при попытки запихнуть его в CreateThread - 1>Sort_Basic.cpp(54): error C2664: CreateThread: невозможно преобразовать параметр 3 из "DWORD (__stdcall Sort_2thread_Basic::* )(void *)" в "LPTHREAD_START_ROUTINE"

Добавлено через 44 минуты
Вышел из положения передачей ссылки на действующий объект класса
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 14:48     Статический метод класса. Доступ к нестатическому объекту.
Посмотрите здесь:

C++ Статический константный объект класса
Классы. Доступ к созданному объекту. C++
C++ Статический элемент и метод класса
C++ Статический и динамический экземпляры класса
Доступ к объекту базового класса при закрытом наследовании C++
Как передать нестатическое поле в статический метод класса? C++
Статический константный член-класса C++
C++ Как передать в метод класса Menu указатель на метод дочернего класса?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 04:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru