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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Copy constructor for class from map<.,.> 
:(
    Опции темы
umlprog
Дата 14.5.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я создаю класс-наследник от map<key,value>

Код

template<typename key, class value>
class Dictionary : private map<key, value>
{
...
}


В качестве value идут указатели на объекты.
Кстати говоря по ходу вопрос: map::clear() не будет уничтожать эти объекты?  (В деструкторе стоит цикл c delete объектов второго параметра)

Пускай имеется Dictionary<int, MyObject*> m_dict c записями.
Когда я выполняю присваивание 
Dictionary<int, MyObject*> m_dict1=m_dict, все указатели второго параметра шаблона копируются.  Таким образом, если разрушается m_dict1, то разрушаются объекты и в m_dict.  А это плохо.
Может нужно перегрузить copy конструктор Dictionary и там попытаться по новому проинициализировать каждый объект, надеюсь, что они также имеют copy конструкторы?
Где я чего не понимаю.

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



****


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

Репутация: 15
Всего: 26



umlprog, используйте shared_ptr
PM MAIL ICQ   Вверх
Gluttton
Дата 14.5.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


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

Репутация: нет
Всего: 54



Цитата(umlprog @  14.5.2010,  17:48 Найти цитируемый пост)
Может нужно перегрузить copy конструктор Dictionary и там попытаться по новому проинициализировать каждый объект, надеюсь, что они также имеют copy конструкторы?


Боюсь ошибиться, но по моему контейнеры STL требуют явной реализации конструкторов копирования...


--------------------
Слава Україні!
PM MAIL   Вверх
JackYF
Дата 14.5.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Gluttton @  14.5.2010,  17:09 Найти цитируемый пост)
STL требуют явной реализации конструкторов копирования... 

Сомневаюсь. Иначе vector< int > бы не работало smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Gluttton
Дата 14.5.2010, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


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

Репутация: нет
Всего: 54



Цитата(JackYF @  14.5.2010,  22:09 Найти цитируемый пост)
Сомневаюсь. Иначе vector< int > бы не работало smile 

Эммм... Походу глупость сморозил...
Попробую реабилитироваться smile ...

По моему, в пользовательских классах, которые размещаются в контейнерах STL должен быть явно реализован конструктор копирования...

JackYF, теплее smile ?


--------------------
Слава Україні!
PM MAIL   Вверх
GoldFinch
Дата 15.5.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



Gluttton, зачем он там? тип должен быть Copyable, а как это происходит - не важно
PM MAIL ICQ   Вверх
Gluttton
Дата 15.5.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


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

Репутация: нет
Всего: 54



ОК... Лучше помолчу...


--------------------
Слава Україні!
PM MAIL   Вверх
umlprog
Дата 15.5.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А можно обойтись без boost?
(Вот как C# людей портит! smile )

Есть способ динамически создать объект как

Код

CRuntimeClass* pRuntimeClass = RUNTIME_CLASS( CMyClass );
CObject* pObject = pRuntimeClass->CreateObject();
ASSERT( pObject->IsKindOf( RUNTIME_CLASS( CMyClass ) ) );



но для этого кажеться, класс должен содержать DECLARE_DYNAMIC макрос, чего ожидать от пользовательского класса не приходится в 100% случаях.  Еще и от CObject нужно унаследоваться.

Это сообщение отредактировал(а) umlprog - 15.5.2010, 16:16
PM MAIL   Вверх
mes
Дата 15.5.2010, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



umlprog, Вы предполагаете, что форумчане знакомы с Вашей  задачей и какими средствами Вы ее реализуете..
Однако на самом деле в большинстве случаев это не так, да и телепаты редко заходят..
Поэтому если хотите получить ответ, высказывайте не кучу не связанных ощущений, а нормально сформированный вопрос..
удачи smile

Добавлено через 6 минут и 12 секунд
P.S. наследование в том числе и приватное от стл контейнеров не рекомендовано. 

Цитата(umlprog @  14.5.2010,  16:48 Найти цитируемый пост)
Dictionary<int, MyObject*>

Я так понимаю хранить Вы хотите в мапе сами объекты, и скорей всего полиморфно,
тогда лучше всего сделать класс-враппер, который будет отвечать за хранение и правильное полиморфное копирование (читать про Clone)
т.е. что то типа map<int, ObjectHolder> 




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


Новичок



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

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



Цитата

Вы предполагаете, что форумчане знакомы с Вашей  задачей и какими средствами Вы ее реализуете..
Однако на самом деле в большинстве случаев это не так, да и телепаты редко заходят..

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

P.S. наследование в том числе и приватное от стл контейнеров не рекомендовано. 

Почему?
Приватное наследование для того, чтобы сохранить целостность данных ограичив доступ к методам, которые могуд поставить целостность под угрозу.  

Про клонирование у меня идея проскальзывала.  Попробую такой подход.



Это сообщение отредактировал(а) umlprog - 16.5.2010, 21:01
PM MAIL   Вверх
mes
Дата 16.5.2010, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(umlprog @  16.5.2010,  19:59 Найти цитируемый пост)
Почему?

потому что они логически законченные..
smile

Цитата(umlprog @  16.5.2010,  19:59 Найти цитируемый пост)
и не хотел перегружать форумчан кучей ненужного (для поднятого вопроса) кода.

перегружать и не нужно.. 


Цитата(umlprog @  16.5.2010,  19:59 Найти цитируемый пост)
Укажите, где вы чувствуете недостаток исходной информации.


ну если в первом посте чувствуется просто не оформленная мысль, то нижеследующее я вообще не понимаю откуда появилось ..

Цитата(umlprog @  15.5.2010,  15:09 Найти цитируемый пост)
А можно обойтись без boost?
(Вот как C# людей портит! smile )

Есть способ динамически создать объект как

предположить, чего Вы хотите этим сказать, конечно можно, но вызывает напряг, после которого уже неохота отвечать...
smile 





--------------------
PM MAIL WWW   Вверх
umlprog
Дата 16.5.2010, 23:00 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

потому что они логически законченные..

Это не ответ.

Цитата

ну если в первом посте чувствуется просто не оформленная мысль, то нижеследующее я вообще не понимаю откуда появилось ..

Уникальные у вас чувства: у других форумчан таких не возникло.

Цитата

предположить, чего Вы хотите этим сказать, конечно можно, но вызывает напряг, после которого уже неохота отвечать...

Разве три несчастные строчки вызывают затруднение?
PM MAIL   Вверх
xvr
Дата 17.5.2010, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(umlprog @  16.5.2010,  23:00 Найти цитируемый пост)
Уникальные у вас чувства: у других форумчан таких не возникло.
У других форумчан они вызвали более законченные чувства, после которых им (форумчанам) читать дальше и декодировать Ваши вопросы расхотелось   smile 
Вы не заметили, что ответы закончились?  smile 

Цитата

Разве три несчастные строчки вызывают затруднение? 
Если бы Вы задали свой вопрос тут, то затруднений не возникло бы.

Цитата

Приватное наследование для того, чтобы сохранить целостность данных ограичив доступ к методам, которые могуд поставить целостность под угрозу.  
Для этого используют включение, а не наследование (что кстати и рекомендуется для stl контейнеров)

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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