36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|||||||||||
1 | |||||||||||
Не могу в дочернем классе вызвать protected метод11.10.2011, 22:52. Показов 5942. Ответов 11
Метки нет (Все метки)
Всем привет! Начал писать одну программку, и столкнулся со следующей проблемой: у меня пока 2 класса: MemObject и Vector, где Vector наследует свойства MemObject. Так вот, в классе MemObject есть чисто виртуальный метод _detectMemUse, который вычистляет память, занимаемую объектом MemObject. Фишка в том, что объект класса Vector должен уметь содержать любые объекты класса MemObject, даже ещё неизвестные. Частью этого плана является то, что при вызове метода _detectMemUse для текущего вектора нужно вызвать этот метод для всех внутренних MemObject-ов, причём в зависимости от реального типа внутреннего объекта будет вызываться свой _detectMemUse. Вот с этим вызовом и возникла продлема. Вот фрагмент кода класса Vector:
1
|
11.10.2011, 22:52 | |
Ответы с готовыми решениями:
11
Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе Вызвать метод класса в другом классе Ошибка в дочернем классе Перегрузка fstream в дочернем классе |
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
12.10.2011, 08:00 | 3 | |||||
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
||||||
12.10.2011, 14:02 [ТС] | 4 | |||||
Вот так:
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
12.10.2011, 14:09 | 5 |
Попробуй не называть локальные переменные, как данные-члены класса. Чтобы вот такое не писать this->memUse=memUse.
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|
12.10.2011, 14:19 [ТС] | 6 |
А разве это поможет?
Добавлено через 2 минуты Для интереса попробовал. Не помогло.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
12.10.2011, 14:21 | 7 |
По крайней мере, код станет читабельным.
Добавлено через 2 минуты Ааааа, так ты про ошибку в строке 9. Классы Vector и MemObject это разные классы, поэтому из объекта Vector нельзя получить доступ к закрытым полям класса MemObject.
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|||||||||||
12.10.2011, 14:30 [ТС] | 8 | ||||||||||
Да, в строке 9
0
|
12.10.2011, 14:50 | 9 | ||||||||||
Тут такое дело - если б ты вызвал _detectMemUse() для this, т.е.
Добавлено через 3 минуты пример:
2
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|
12.10.2011, 18:30 [ТС] | 10 |
Как-то не очень удобно сделано. И как можно получить доступ к защищённым полям класса, если невозможно обращаться к ним через this? Я думаю нужно использовать дружественые классы, но тогда нужно при создании каждого нового потомка добавлять его в список дружественных классов. А может есть другие способы?
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
12.10.2011, 18:36 | 11 |
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|||||||||||
13.10.2011, 00:28 [ТС] | 12 | ||||||||||
А если, например, создать в классе MemObject метод callDetectMemUse, который будет получать указатель на объект MemObject и возвращать результат _detectMemUse, но уже вызванный для этого объекта, и вызывать callDetectMemUse через this. Тогда произойдёт "плавный" вызов нужного метода от имени класса MemObject. Вот что у меня получилось (_detectMemUse я переименовал в insideDetectMemUse, чтоб не путаться, поскольку detectMemUse у меня в этом классе тоже есть): MemObject.h:
Добавлено через 7 минут В сторке 50 MemObject.h искомая функция-обёртка для insideDetectMemUse, а в сторке 18 Vector.cpp её вызов.
0
|
13.10.2011, 00:28 | |
13.10.2011, 00:28 | |
Помогаю со студенческими работами здесь
12
Переопределенные операторы в дочернем классе Как в классе А у объекта класса B вызвать метод класса B ? Использование переменных базового класса в дочернем классе Изменение информации в дочернем классе, через ссылку Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |