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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Помогите со стеком, пожалуйста! http://www.cyberforum.ru/cpp-beginners/thread572057.html
Используя стек, решить следующую задачу. В текстовом файле f записана без ошибок формула следующего вида: <формула> ::= <цифра> | М(<формула>, <формула>) | m(<формула>, <формула>) <цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9, где М обозначает функцию max, a m- min. Вычислить как целое число значение данной формулы. Например, М(5,m (6,8))=6. #include <ctype.h> #include...
C++ Проверьте код на ошибки #include <stdio.h> using namespace std; void main() { char c; int k=1; for( ;c=getchar()!=".";-) { if (c==" ")k++;} http://www.cyberforum.ru/cpp-beginners/thread572049.html
C++ Перемножение многочленов, преобразование Фурье
Добрый день! Тема слегка избитая, но все же. Нужно реализовать перемножение многочленов, используя быстрое преобразование Фурье. Многочлены представляются в виде класса: class poly //class containing array of polynomial's coefficients and its size { int *koef; int n; public:
C++ "мёд как бы есть, но его как бы нет"
#include <iostream> using namespace std; int main() { int array; for (int i=0; i<5; i++) { array = i;
C++ Картотека в бюро обмена квартир (связные списки, файлы и т.д.) http://www.cyberforum.ru/cpp-beginners/thread572036.html
Всем Здрасьте) Вот задание:Картотека в бюро обмена квартир организован как линейный список. Сведения о каждой квартире содержат: количество комнат; этаж; площадь; адрес.
C++ Дана символьная строка,написать программу которая.. Дана символьная строка. Написать программу, которая заменяет каждую из латинских букв этой строки на две звездочки. #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<ctype.h> #include<string.h> void Vstavka(char *s) подробнее

Показать сообщение отдельно
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 269

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

12.05.2012, 14:48. Просмотров 1482. Ответов 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 минуты
Вышел из положения передачей ссылки на действующий объект класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru