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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 269
#1

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

12.05.2012, 14:48. Просмотров 1487. Ответов 0
Метки нет (Все метки)

Существует класс
во время работы этот класс создает поток, который в качестве одного из аргументов принимает метод этого же класса.

файл класс.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++
Есть класс Pair из стандартной библиотеки. Он у меня содержит 2 массива valarray. От класса Pair я создаю наследника Wine. В классе Wine...

Статический элемент и метод класса - C++
Доброго времени суток, разбираюсь со статическим элементом и методом класса. накидал небольшую програмку, но Visual Studio 2010 ее не...

Как объявить статический метод класса? - C++
выдает ошибку на 11 16 19 строку((((((( #include &lt;iostream&gt; using namespace std; class Sop { private: short int kol; ...

Как передать нестатическое поле в статический метод класса? - C++
есть статическая фукция static LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM); в ней нужно использоавть поля класса, вопрос -...

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2012, 14:48
Привет! Вот еще темы с ответами:

Статический указатель класса на объект этого же класса - C++
Не пойму: что в этом коде не так? #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; struct A { int x; ...

Как передать в метод класса Menu указатель на метод дочернего класса? - C++
Как передать в метод базового класса указатель на метод дочернего: class Menu() { protected: setCallback(*********); //...

Классы. Доступ к созданному объекту. - C++
Доброе утро, форум.:friends: Имеется код, чисто для примера. файл book.h #ifndef BOOK_H #define BOOK_H struct Book {

Статический экземпляр класса - C++
Такой вопрос, есть класс с полями как сделать чтобы был только один статический экземпляр такого класса? #include &quot;stdafx.h&quot; #include...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru