Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура и поэлементное удаление 
V
    Опции темы
bsa
Дата 30.12.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(SABROG @ 30.12.2008,  16:49)
А что именно не нравится, сама задача или то как я реализовал и у тебя есть третий вариант ее решения smile ? Или ты имеешь ввиду, что не замарачивался бы вообще с этим и прописывал все ручками ?

Вернемся к исходной задаче. Тебе лень удалять кучу разных объектов, память под которые выделена динамически. Для этого лучше использовать std::auto_ptr (особенно, когда нет задачи передавать указатель за пределы объекта его содержащего).
А по поводу того, что в итоге получилось - это просто непонятно что, непонятно для чего и непонятно что делает. Другими словами, это отход от приципа: "программа пишется для программиста, а не для компьютера". Может оно и оптимально по скорости, но я бы на твоем месте подумал о будущем - что ты будешь делать с этим через пару месяцев.
PM   Вверх
SABROG
Дата 30.12.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(mes @  30.12.2008,  17:15 Найти цитируемый пост)
Хотя бы то, что способ использования определен "далеко" от декларации.


А как сделать, чтобы было "близко" ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SABROG
Дата 30.12.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(bsa @  30.12.2008,  17:27 Найти цитируемый пост)
Тебе лень удалять кучу разных объектов, память под которые выделена динамически. Для этого лучше использовать std::auto_ptr (особенно, когда нет задачи передавать указатель за пределы объекта его содержащего).

Мне не лень, просто слишком много данных придется держать в памяти, чтобы не забыть где-то добавить удаление добавленного параметра. Да и задача передачи указателя за пределы объекта есть, тот код, что я написал всего-лишь отражение моих желаний.

Цитата(bsa @  30.12.2008,  17:27 Найти цитируемый пост)
Может оно и оптимально по скорости, но я бы на твоем месте подумал о будущем - что ты будешь делать с этим через пару месяцев. 


Написал и забыл smile Через пару месяцев я с этим точно ничего делать не буду. Вспоминается одно из правил плохого тона программирования: "временные решения очень быстро становятся постоянными".

P.S.: снял пометку о решении. Раз местным гуру не нравится такой вариант, остается ждать либо другого решения, либо ответа почему подобная ситуация не должна возникать в принципе...

Это сообщение отредактировал(а) SABROG - 30.12.2008, 18:29


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
Мне не лень, просто слишком много данных придется держать в памяти, чтобы не забыть где-то добавить удаление добавленного параметра. 

Как раз своей новой конструкцией Вы и обременили себе память. 

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
Да и задача передачи указателя за пределы объекта есть, тот код, что я написал всего-лишь отражение моих желаний.

Не понял.

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
Написал и забыл smile Через пару месяцев я с этим точно ничего делать не буду.

Один раз написал - забыл, второй, а в третий так вылезет, что мало не покажется.  smile 

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
. Вспоминается одно из правил плохого тона программирования: "временные решения очень быстро становятся постоянными"

вот вот  smile 


Цитата(SABROG @  30.12.2008,  17:31 Найти цитируемый пост)
А как сделать, чтобы было "близко" ? 

"Далеко" это как например внутри Get-функции создавать объект который должен быть удален снаружи.
А "близко" это то что создано в конструкторе- удаляeтся в деструкторе.

Вся реализация (а тем более с трюками) должна быть абсолютна изолирована  от остальной части кода. 
Т.е для начала составьте интерфейс который нужен будет остальной проге, а потом реализуйте его как хотите.

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
остается ждать либо другого решения, либо ответа почему подобная ситуация не должна возникать в принципе...

Для решения нужно как минимум понять, что требуется и как это будет использовано.


Это сообщение отредактировал(а) mes - 30.12.2008, 18:49


--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



SABROG, для начала попробуй описать что ты хочешь получить в итоге (методы реализации на данном этапе не интересны).
Например, то что ты написал в первом сообщении можно сделать так:
Код
struct MyStruct
{
    std::auto_ptr<mytype> country;
    std::auto_ptr<mytype> book;
    std::auto_ptr<mytype> author;
    std::auto_ptr<mytype> pages;
    std::auto_ptr<mytype> language;
    ... и т.д. элементов 20 или более
    int item;
    double number;
};
Теперь, для получения просто указателя нужно применить метод get(). Для (пере)присвоения значения указателю - метод reset(). Для доступа к содержимому - стандартный синтаксис (унарная * или ->). delete будет вызван автоматически при уничтожении экземпляра объекта MyStruct.
Но я не уверен, что это все нужно городить, так как мне кажется сама идея хранения такого большого списка однотипных параметров нелогичной. Может стоит сделать как-то иначе?
PM   Вверх
SABROG
Дата 30.12.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(bsa @  30.12.2008,  18:51 Найти цитируемый пост)
Но я не уверен, что это все нужно городить, так как мне кажется сама идея хранения такого большого списка однотипных параметров нелогичной. Может стоит сделать как-то иначе? 


Предположим есть treeview, который является Property Editor'ом для какой-нибудь IDE или просто редактор БД.
Несмотря на то, что каждый параметр имеет свой тип, сами итемы этого treeview - одного класса. В итоге 10 строковых параметров, 5 интовых, 4 блоба, 8 флоат - все указатели имеют один тип - элемент treeview.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  19:26 Найти цитируемый пост)
Несмотря на то, что каждый параметр имеет свой тип, сами итемы этого treeview - одного класса. В итоге 10 строковых параметров, 5 интовых, 4 блоба, 8 флоат - все указатели имеют один тип - элемент treeview. 


То есть у нас есть структура которое содержит n-e кол-во наследников одного типа. Тут понятно.. Но пока видим только массив.
 Продолжайте.  smile 


--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(mes @ 30.12.2008,  19:37)
Но пока видим только массив.

Аналогично
PM   Вверх
SABROG
Дата 30.12.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Ну да, видим массив. Но массив то с ограниченным количеством элементов. Как говорится, уже нельзя всех под одну гребенку (сорри после корпоратива, мозга не варит и в квартире воняет протухшей рыбой).

Это сообщение отредактировал(а) SABROG - 30.12.2008, 21:57


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  21:56 Найти цитируемый пост)
Ну да, видим массив. Но массив то с ограниченным количеством элементов. 

и что это меняет ? 
Разница возникнет, тогда, когда Вам 
1. либо надо знать конкретный тип каждого/определенного элемента
2. либо обращаться к элементу по имени (опять же известно ли имя на момент компиляции? и полезна ли даная известность ?)



--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



SABROG, не вижу проблем с ограниченностью количества элементов. Почему нельзя написать в структуре mytype *items[20]?
PM   Вверх
SABROG
Дата 31.12.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



А параметры проверять так чтоль ?

Код

items[0]->text();


Вместо

Код

root->title->text();



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 31.12.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  31.12.2008,  11:06 Найти цитируемый пост)
А параметры проверять так чтоль ?

а почему бы не root->title()->text();  или  даже root()->title()->text();  ?
если конечно статические имена в Вашем случае удобны чем динамические.


Это сообщение отредактировал(а) mes - 31.12.2008, 12:41


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 31.12.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(mes @ 31.12.2008,  12:41)
Цитата(SABROG @  31.12.2008,  11:06 Найти цитируемый пост)
А параметры проверять так чтоль ?

а почему бы не root->title()->text();  или  даже root()->title()->text();  ?
если конечно статические имена в Вашем случае удобны чем динамические.

С массивом я такое смогу провернуть только если создам класс как уже писали тут http://forum.vingrad.ru/index.php?showtopi...t&p=1743811

auto_ptr использовать опасно т.к. treeview может сам удалить указатель.

Это сообщение отредактировал(а) SABROG - 31.12.2008, 13:11


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 31.12.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  31.12.2008,  13:06 Найти цитируемый пост)
auto_ptr использовать опасно т.к. treeview может сам удалить указатель.

а "вручную" как Вы узнаете что treeview уже удалил элемент и его не надо удалять?

Цитата(SABROG @  31.12.2008,  13:06 Найти цитируемый пост)
только если создам класс 

пока Вы не привели ни одного довода, для создания той структуры о которой идет речь. 
Как я понял у Вас есть treview с элементами. Вы делаете его маппинг. Т.е Ваша структура служит посредником для доступа к определенным полям.
В таком случае использование открытой структуры, внесет Вам большой ряд проблем.
Если доступ к элементам будет "разгружен" функцией, то Вы отгородите реализацию "компонента" от остальной программы.

Все таки до сих пор не понятно, важно ли для самой программы (ее бизнес-логики) знание статического имени.
можно ведь вместо  root()->title()->text(); использовать динамическое имя root()->node(title)->text().

ну а можно статическое root()->node<title>()->text(). (для удобства только придется у Александреску позаимствовать шаблоны TypeList и некоторые другие)




Это сообщение отредактировал(а) mes - 31.12.2008, 14:06


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1218 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.