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

Не могу в дочернем классе вызвать protected метод - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сортировки http://www.cyberforum.ru/cpp-beginners/thread364954.html
Доброго времени суток. Задача была, отсортировать диагонали матрицы nxn, параллельные побочной методом выбора, вроде всё сделал, а побочную тоже сортирует, не могу допереть где '=' убрать #include <iostream> void choiseSorting (int **array, int quantity, bool top) { int Min = 0; int MinNum = 0; int Elem;
C++ помогите!! побитовыми операциями вычесть два числа вычесть из числа, введенного пользователем, число 3 используя ТОЛЬКО побитовые операции.помогите новечку) http://www.cyberforum.ru/cpp-beginners/thread364942.html
C++ Поиск в заданной строке последнего вхождения заданного символа
Помогите написать функцию, которая ищет в заданной строке последнее вхождение заданного символа (char *strrchr(const char *s1, int c)
C++ Программа для обнаружения и коррекции "пачки" ошибок
Доброе время суток! Кто может помочь с реализацией программы для обнаружения и коррекции "пачки" ошибок, которая предусматривает использование взвешенной контрольной суммы (с использованием арифметических операций). Конечно же не за спасибо. Также буду благодарен если у кого-то есть исходный код программы коррекции искаженных символов с использованием кодов Рида-Соломона.
C++ Табуляция http://www.cyberforum.ru/cpp-beginners/thread364897.html
Здравствуйте, помогите пожалуйста написать программу табулирования функции (х0 – начальное значение, хk – конечное значение аргумента, ∆x – прирост аргумента, n – кількість табуляций) при a = 3,3333; b = 0,765; r = 2,22; f = 1; q = 6,33; x0 = –1; xk = 3,5; ∆x = 0,25.
C++ Вычислить количество и произведение элементов массива, удовлетворяющих условию В одномерном массиве из n вещественных элементов вычислить : 1)количество элементов массива больших С. 2)произведение элементво массива , расположенных после максимального по модулю элемента. подробнее

Показать сообщение отдельно
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
13.10.2011, 00:28  [ТС]     Не могу в дочернем классе вызвать protected метод
А если, например, создать в классе MemObject метод callDetectMemUse, который будет получать указатель на объект MemObject и возвращать результат _detectMemUse, но уже вызванный для этого объекта, и вызывать callDetectMemUse через this. Тогда произойдёт "плавный" вызов нужного метода от имени класса MemObject. Вот что у меня получилось (_detectMemUse я переименовал в insideDetectMemUse, чтоб не путаться, поскольку detectMemUse у меня в этом классе тоже есть): MemObject.h:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#pragma once
 
class MemObject
{
 
public:
 
    //Указатель на функцию контроля памяти
    //(вызывается при {выделении/освобождении} памяти)
    //Параметры: размер блока памяти и номер объекта, 
    //{захватившего/освободившего} память
    //Функция позволяет вызывать механизм 
    //{сохранения/загрузки} данных {на диск/с диска} при 
    //{нехватке/достаточном количестве} памяти
    typedef void (*MemControlPointer)(i8,i8);   
 
    //Указатель на функцию, 
    //вызываемую при перехвате исключений, 
    //генерируемых при выделении памяти
    //Параметры: размер блока памяти, 
    //при выделении которого призошла ошибка
    //и номер объекта-источника исключения
    typedef void (*MemErrorPointer)(i8,i8);
 
protected:
 
    //Указатель на функцию контроля памяти и 
    //флаг блокировки этого контроля
    MemControlPointer memControl;
    bool isBlockedMemControl;
 
    //Используемая обектом память
    i8 memUse;
    
    //Номер текущего объекта для функции
    //{контроля/ошибки} памяти
    i8 currElemNum;
 
    //Функция изменения флага блокировки контроля памяти
    //Вызывается рекурсивно для всех внутренних объектов
    virtual void setIsBlockedMemControl(bool val)=0;
 
    //Подсчитывает занимаемую объектом память, и,
    //в зависимости от флага isUpdateMemUse,
    //обновляет значение поля memUse
    virtual i8 insideDetectMemUse(bool isUpdateMemUse)=0;
 
    //Получает указатель на MemObject и 
    //вызывает insideDetectMemUse от его имени
    i8 callInsideDetectMemUse(bool isUpdateMemUse, MemObject *memObj);
 
    //Получает указатель на MemObject и 
    //вызывает setIsBlockedMemControl от его имени
    void callSetIsBlockedMemControl(bool val, MemObject *memObj);
 
    //Указатель на функцию, вызываемую при
    //ошибке выделения памяти
    MemErrorPointer memError;
 
public:
 
    //Деструктор
    //Вызывает memControl(-memUse,currElemNum),
    //если флаг isBlockedMemControl==false
    //Поэтому при удалении дочернего объекта
    //не нужно заботиться об учёте факта 
    //освобождения памяти
    virtual ~MemObject(void);
 
    //Конструктор
    MemObject(
        MemControlPointer memControl,
        bool isBlockedMemControl,       
        i8 currElemNum,     
        MemErrorPointer memError);
    
    //Обёртка insideDetectMemUse,
    //которая вызывает insideDetectMemUse
    //с параметром false
    //Это нужно, чтобы пользователь класса
    //не мог изменять поле memUse,
    //например, если поле memUse хранит
    //не всю память, а только память,
    //занимаемую текущим объектом без учёта
    //внутренних объектов
    i8 detectMemUse();
 
    //Доступ к полям
    MemControlPointer getMemControl();
    bool getIsBlockedMemControl();
    i8 getMemUse();         
    i8 getCurrElemNum();
    MemErrorPointer getMemError();
 
};
Фрагмент кода Vector.cpp:
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
//Вычисление занимаемой объектом памяти
//Параметр - флаг обновления текущего значения используемой памяти
//Возвращаемое значение - занимаемая память
i8 Vector::insideDetectMemUse(bool isUpdateMemUse)
{
    //Подсчёт памяти без учёта внутренних объектов
    i8 currMemUse=microDetectMemUse();
 
    //Если есть внутренние объекты
    if (type==MEM_OBJECT)
    {
        MemObject **tmpObj=(MemObject **)data;
        for (i8 i=0; i<cellsCount; i++)
        {
            //Если ссылка на внутренний объект не нулевая, то вызов
            //вычислителя памяти для внутреннего объекта
            if (*tmpObj) currMemUse+=
                callInsideDetectMemUse(isUpdateMemUse,*tmpObj);                         
            tmpObj++;
        }
    }
 
    //Обновление поля занимаемой памяти
    if (isUpdateMemUse) memUse=currMemUse;  
 
    return currMemUse;
}
Сработало)))

Добавлено через 7 минут
В сторке 50 MemObject.h искомая функция-обёртка для insideDetectMemUse, а в сторке 18 Vector.cpp её вызов.
 
Текущее время: 07:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru