Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Copy constructor for class from map<.,.>


Автор: umlprog 14.5.2010, 17:48
Я создаю класс-наследник от 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 конструкторы?
Где я чего не понимаю.

Автор: GoldFinch 14.5.2010, 18:06
umlprog, используйте shared_ptr

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


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

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

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

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

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

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

JackYF, теплее smile ?

Автор: GoldFinch 15.5.2010, 11:12
Gluttton, зачем он там? тип должен быть Copyable, а как это происходит - не важно

Автор: Gluttton 15.5.2010, 11:39
ОК... Лучше помолчу...

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

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

Код

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



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

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

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

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

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


Автор: umlprog 16.5.2010, 20:59
Цитата

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

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

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

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

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


Автор: mes 16.5.2010, 21:47
Цитата(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 



Автор: umlprog 16.5.2010, 23:00
Цитата

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

Это не ответ.

Цитата

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

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

Цитата

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

Разве три несчастные строчки вызывают затруднение?

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

Цитата

Разве три несчастные строчки вызывают затруднение? 
Если бы Вы задали свой вопрос http://forum.vingrad.ru/forum/VisualC++MFC-WTL.html, то затруднений не возникло бы.

Цитата

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)