Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ кривой Безье https://www.cyberforum.ru/ cpp/ thread192259.html
написать проектную процедуру создания кривой Безье, Желательно в С++ Добавлено через 17 часов 16 минут помогайте срочно надо(( я не знаю как сделать .... ил дайте ссылку на информацию как ее...
Выявление такого же ай-пи/мак адреса C++
Усем здрасти!) имеется необходимость написать приложение, которое, бы присваивало ip адрес сетевой карте и менять ее мак-адресс. Но самое интересное, что приложение должно извещать пользователя о...
C++ КНИГИ
Подскажите харошую(лучшую) книгу по С++ ИЛИ Visual C++ Добавлено через 2 часа 45 минут Посрветуйте
C++ Использование данных из разных потоков Привет всем! Возникла проблема с использованием данных из разных потоков в многопоточном приложении 1) Допустим созданы два потока, которые создают некоторые переменные. Как потом подключиться... https://www.cyberforum.ru/ cpp/ thread191392.html
C++ Как достать архив из exe https://www.cyberforum.ru/ cpp/ thread191290.html
Короче, нужно засунуть архив в exe и при запуске программа должна вытащить этот архив на рабочий стол. Подскажите как это можно реализовать программно??? :wall:
C++ Фрагментирование файла
Всем доброго времени суток. Пишу программу для работы с большими файлами. Файл состоит из блоков размером 512 байт. Каким образом при удалении блоков в середине файла сделать так, чтобы система не...
Cannot open include file: 'stream.h': No such file or directory C++
Для использования функций ввода/вывода cin/cout как я понимаю необходимо подключени библиотеки stream.h ? Но Visual Studio 2008 ругается - fatal error C1083: Cannot open include file: 'stream.h':...
C++ Вопрос по знаку ; Реакция программы с применением этого знака и без него #include "stdafx.h" #include <conio.h> int main() { int fahr; for(fahr=0; fahr <= 300; fahr= fahr + 20) printf("%4d %6.1f\n",fahr,(5.0/9.0)*(fahr-32.0)); _getch(); https://www.cyberforum.ru/ cpp/ thread190965.html
C++ Способы решения тривиальных/не тривиальных задач https://www.cyberforum.ru/ cpp/ thread190349.html
Други! В этой теме я предлагаю выкладывать свои способы решения тривиальных/не тривиальных задач и стремиться к элегантности их решения, то бишь к совершенству кода. Это будет способствовать...
C++ Взаимодействие cpp-dll и delphi-программы Есть программа, написанная на делфи, а также две длл: одна на с++, другая на делфи. Программа передает параметр - указатель packed record. PToRec = ^TRec; TRec = packed record mybool:... https://www.cyberforum.ru/ cpp/ thread190299.html
140 / 141 / 64
Регистрация: 11.11.2010
Сообщений: 861
Записей в блоге: 10
0

callback метода класса

17.11.2010, 15:21. Просмотров 4529. Ответов 2
Метки (Все метки)

Предыстория: нужно последовательно запускать несколько однотипных циклов большой степени вложенности, в теле которых вызывать разные функции.
Т.к. вроде бы переписывать циклы (тем более громоздкие по STL-ным контейнерам) плохо, то я решил сделать одну функцию, в которой реализуется цикл, в теле которого вызывается переданная в качестве параметра callback-функция. Все эти функции имели отношение к классу, так что и callback функция-
являлась методом.
Далее по существу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// класс "учебный процесс" - оформляет последовательность
// действий в программе
class CStudy {
    // деканат, который содержит и всю остальную структуру
    CDeanery deanery;
 
public:
    // обработка всего учебного процесса в течение семестра
    void CStudy::Process() {
        
        Init();                 // инициализация всей системы
        SelectQualWorks();      // выбор квалификационных работ студентами
        ExecuteOrders();        // выполнение приказов
        MakeExams();            // проведение экзаменов
        MakeCritics();          // написание рецензий
        ProtectQualWorks();     // защита квалификационных работ
        CreateFateOrders();     // создание приказов по результату сессии
        ExecuteOrders();        // выполнение приказов
    }
private:
    // инициализация всей системы
    void Init() {
        deanery.Init();
    }
    // выбор квалификационных работ для всех выпукников - и выпуск приказов
    void SelectQualWorks() {
        ForEachStudent( &CStudy::SelectQualWork );  // (1)
    }
    // провести экзамены для всех студентов - получить их нижние оценки
    void MakeExams() {
        ForEachStudent( &MakeExam );    // (2)
    }
    // написание рецензий для кв. работ всех студентов, кто пишет кв. работы
    void MakeCritics() {
        ForEachStudent( &MakeCritic );  // (3)
    }
    // защита кв. работ всех студентов, пишущих кв. работы
    void ProtectQualWorks() {
        ForEachStudent( &ProtectQualWork ); // (4)
    }
    // создание приказов по результату сессии
    void CreateFateOrders() {
        deanery.CreateFateOrders();
    }
    // выполнение текущих приказов
    void ExecuteOrders() {
        deanery.ExecuteOrders();
    }
 
 
private:
    //// функция-параметр для исполнения для каждого студента
    //typedef void CStudy::ProcessStudent( CStudent* );
    //typedef ProcessStudent* PProcessStudent;
 
    // функциия, исполняющая выполняющая свою функцию-параметр надо всеми студентами
    void ForEachStudent( void ( *CStudy::pFunc )( CStudent * ) );
 
    // выбрать работу одним студентом
    void SelectQualWork( CStudent *st );
    // пройти экзамен одним студентом
    void MakeExam( CStudent *st );
    // написать рецензию для кв. работы студента
    void MakeCritic( CStudent *st );
    // провести защиту кв. работы студента
    void ProtectQualWork( CStudent *st );
 
 
 
};
Собственно такой кульбит с CStudy:: в (1) обусловлен попыткой исправить ошибку аналогичную возникающим в строках (2), (3), (4). Итак ошибки следующие:
(2), (3), (4) :
C++
1
Error   2   error C2276: '&' : illegal operation on bound member function expression    d:\!study\тти\3 семестр\ооп\oop\oop_course\study.h 36
(1) :
C++
1
Error   1   error C2664: 'CStudy::ForEachStudent' : cannot convert parameter 1 from 'void (__thiscall CStudy::* )(CStudent *)' to 'void (__cdecl *)(CStudent *)'    d:\!study\тти\3 семестр\ооп\oop\oop_course\study.h 32
Мне кажется (1) шаг в сторону исправления, но помогите добить эту маленькую... Заранее признателен за конструктив.

Вернуться к обсуждению:
callback метода класса
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2010, 15:21
Готовые ответы и решения:

Вызов метода класса из другого класса
Есть два класса &quot;нижнего уровня&quot; и один &quot;верхнего уровня&quot; Классы &quot;нижнего уровня&quot; имеют методы с...

Метод класса не работает как callback-функция
Всем привет! Помогите разобраться с синтаксисом. Есть gui-прога, в которой содержится функция...

Использование метода класса как функции в качестве типизированного аргумента в методе класса
Использование метода класса как функции в качестве типизированного аргумента в методе класса ...

Доступ к приватному полю класса X из метода класса Y
class X { private: int a; }; class Y {

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