![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Вот хочу создать базовый класс с перегруженными new и delete, всё отлично, только вот мне нужно в операторе delete знать размер удаляемого класса, чтобы передать менеджеру памяти (его суть как раз что он его не запоминает). Т.е. если удаляется производный класс то нужен соответственно размер производного класса. Вот такая реализация не компилится:
ругаясь на строчку
а конкретно на mysize() : a nonstatic member reference must be relative to a specific object. Во-первых я не понимаю что ему надо, а во-вторых такая реализация не блещет изяществом ![]() В каждом производном классе придётся вставлять
что не весело. Может кто подскажет как это по человечески сделать? |
||||||
|
|||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
(его - размер)
В этом и фишка, т.е. что никак чтоли? Если рассуждать логически, то все известные нам даны уже на этапе компиляции, нужно только их правильно использовать. Почему же моя реализация не работает? добавлено: Я тут покопался, оказывается operator delete - статическая функция :( и что делать? Это сообщение отредактировал(а) georain - 29.1.2008, 22:24 |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
georain,
плохо что мешает сделать так
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Это не подходит. Тут фишка в экономии памяти.
Ведь смотрите, если уж мы в каждом классе всё равно имеем издержки на указатель к виртуальной таблице, так почему бы нам не хранить размер каждого класса только в одном экземпляре. И при удалении по заданному адресу получать из этого же адреса и размер области (размер класса) через виртуальную функцию. Пока писал понял как реализовать ![]() Это сообщение отредактировал(а) georain - 31.1.2008, 03:14 |
|||
|
||||
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Я изменил интерфейс менеджера на
т.е. теперь он принимает только указатель, т.е. operator delete остаётся статическим, а для определения размера я вызываю
уже изнутри менеджера. Вуоля, пока на форуме не расписал всё, ничего понять не мог, что происходит. Только теперь остаётся ещё одна интересная задачка: в каждом наследуемом классе придётся писать функцию
можно ли это обойти? ;) Это сообщение отредактировал(а) georain - 30.1.2008, 00:05 |
||||||
|
|||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
зачем? не вижу необходимости |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
эээ... поясни пожалуйста или ты имеешь ввиду что и так нормально. На самом деле да, это небольшие затраты, но ведь это повторение кода. Абсолютно одинакового кода, неужели нет способов этого избежать (кроме #define ![]() Это сообщение отредактировал(а) georain - 30.1.2008, 00:39 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
georain, сделай деструктор виртуальным, и ты сможешь получать размер оператором sizeof, ф-я mysize будет ненужна
|
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
придется, а что поделать? :( при агрегации тоже часто куча копипаста |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Блин, ещё раз. Вы в памяти при создании объекта храните количество байт в этом объекте. Этот же размер использует delete, когда ему нужно удалить память. На фига вам mysize(), объясните мне?
|
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Извините, что вклиниваюсь в вашу увлекательную беседу на тему "как сделать так, чтобы враг не догадался"
![]()
Это сообщение отредактировал(а) archimed7592 - 30.1.2008, 17:39 -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
А нельзя delete на шаблонах сделать? Щаз компилера под руками нет.
--------------------
|
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Если ты про operator delete, то можно, но толку от такого оператора будет немного, ибо вызывать можно будет только явно. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Ответ прост: нам не нужно в каждом объекте хранить ещё одно поле, размер мы получаем статически. (гигибайты оперативки медленно но верно делают свою дело ![]()
![]()
А вот и ответ на вопрос "Как в перегруженный оператор delete добавить размер класса" Спасибо! Это сообщение отредактировал(а) georain - 31.1.2008, 02:58 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |