![]() |
|
Модераторы: bsa |
![]()
|
|
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Есть класс сторонней библиотеки, в которой запрещен конструктор копирования. Есть вот такая ситуация, где C это и есть класс той самой библиотеки:
В конструктор класса C надо передавать различные параметры и каждый новый экземпляр объекта класса C помещать в список lst. Создание объекта через new использовать не хочу, дабы избежать даже намека на утечку памяти. Такой способ естественно не работает из-за попытки вызвать конструктор копирования:
Это сообщение отредактировал(а) SABROG - 26.9.2008, 14:47 |
||||
|
|||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 2 Всего: 37 |
Как насчет списка инициализации у B
Это сообщение отредактировал(а) Sartorius - 26.9.2008, 14:54 |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
значит такой объект нельзя копировать, а такие объекты нельзя помещать в контейнер. Тебе нужно определить копирующий конструктор класса B и в нем решать, что делать с С и как его копировать. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
можно попрбовать хранить контейнер из умных указателей, если, конечно, семантика задача соответствует
-------------------- qqq |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
раз копиконстрактор запрещен, значит на то есть причины
как сказали выше - используй shared_ptr:
|
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Честное слово, чем больше работаю с ЯВУ - тем больше у меня отвращение к нему. А все из-за того, что первым языком программирования который я изучил был ассемблер. Там я мог делать все, причем одну задачу мог выполнить несколькими способами. Тут же мне приходится изучаться синтаксис, чтобы обойти ограничение и я реально теряю много времени на это. Простейшая задача - записать в область памяти по некому адресу свои данные в момент загрузки программы. В итоге меня отправляют использовать shared_ptr из черновика к новому стандарту. В общем ситуация, когда ЯВУ не помогает написанию программы, а препятствует написанию оной, причем без веских причин. |
||||
|
|||||
| mes |
|
||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
На вкус и цвет товарища нет
Тоже проходил асм в самом начале, и именно поэтому люблю Яву, а особенно ООП.
Значит решаете задачу не тем (не естесственным) путем. Значит Вы так описали задачу. То что Вам предложили shared_ptr посодействовала фразa:
До этого кстати Вам предложили: Кстати судя по коду , объект класса C полностью контролируем классом хозяином. В таком случае утечки памяти легко исключить. например использованием std::auto_ptr )
Ага, именно так - ситуация когда программист пытается использовать действия, которые до этого были помечены как опасные. Такое препядствие и есть преимущество ЯВУ. Опишите компилятору , как поступать в случае копирования или не пользуйтесь копированием и вся проблема уйдет ) А программистам, которые лучше компилятора могут проследить за всеми несоответствиями, удержать в памяти все конфликтные места, недопустить и готовы выполнять эту работу вместо компилятора (если конечно такие существуют), лучше использовать Ассемблер ну или на крайний случай Си. С++ разрабатывался не для них Это сообщение отредактировал(а) mes - 26.9.2008, 22:34 |
||||||||||
|
|||||||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| J0ker |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
std::auto_ptr нельзя использовать в контейнерах
синтаксис нужно изучать не чтобы, а потомучто А ограничения существуют не для того, что-бы их обходить. Если копиконстрактор запрещен, значит объект содержит инкапсулированные некопируемые ресурсы. Такая возможность - это достоинство, а не недостаток.
как вы задачу сформулировали, так вам и отвечают Когда вы помещаете объект в лист - то туда помещается не сам объект, а его копия - так работает этот класс. Раз вам это не подходит, значит надо что-то менять в архитектуре. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
В контейнер насколько я помню помещается объект класса B, a закрытый конструктор у класса C, при этом как я понял B-объект является хранителем, C-объекта . Вот я предложил использовать auto_ptr , чтоб не забыть удалить объект в деструкторе. ) А чтоб ответить точнее, нужно более точное описание задачи, а не пример готового непонятного решения ) Добавлено через 28 секунд Склоняюсь к этому же мнению . |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
это не имеет в данном контексте никакого значения - при копировании В все его мемберы копируются. STL контейнеры не гарантируют целостность auto_ptr. Это сообщение отредактировал(а) J0ker - 26.9.2008, 23:18 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
boost::ptr_list отлично для этого подходит. Добавлено через 1 минуту и 42 секунды boost::ptr_list может принимать std::auto_ptr. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |