|
|
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Есть класс 1, был абстрактный, а пришлось сдеалать просто виртуальным, и класс 2, от него наследуется. Есть map, значение - класс1. Кладу туда класс 2, потом высовываю, получается вызов функций класса 1, виртуальные класса 2 не вызываются. Так понял, что происходит преобразование класса 2 в класс1 когда производилось всовывание в map. Соответсвенно, информация про класс 2 потерялась. Пришлось в map, класть указатель на класс 2, а значением map делать указатель на класс1. Минус - надо возиться с указателями. Есть ли другие решения, как в map, запихнуть класс2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 11:01 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Вы нарвались на усечение при присваивании. Полиморфные типы в STLевских классах надо хранить по ссылке, а не по значению ( т.е. хранить указатели на тип в данном конкретном случае, поскольку STL хранение по ссылке не поддерживает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 11:32 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
так ты объект прям по значению запихивал??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 11:46 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Это я понимаю в случае с map. Что значит, хранение по ссылке? Ведь в stl же существует какой-то auto_ptr? Я в принципе интересуюсь структрой классов. Допустим есть класс 2 со звездочкой, который наследуется тоже от класса 1. Обычная схема собаки и кошки от животного. Можно ли как-то изменить схему, для того чтобы map разобрался что в нем хранится? Ну или не map а базовый класс. Или не базовый класс, а что там получиться. Только без всяких смарт-поинтеров (это опять же указатели). Т.е. что-то типа протаскивание виртуальной таблицы от созданного класса, в класс, который скопирует себе map? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 11:47 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
maXmoтак ты объект прям по значению запихивал??? Вот именно. :) Я же написал - значение класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 11:48 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
используйте boost::shared_ptr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 11:50 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
полиморфизм поддерживается только на уровне указателей, насколько я помню… А если базовый класс абстрактный, то всё пашет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 11:57 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
maXmoполиморфизм поддерживается только на уровне указателей, насколько я помню… А если базовый класс абстрактный, то всё пашет? 1. Вот, поэтому я считаю, что моя идеа абсурдна. 2. По значению не может пахать. Так как map не может хранить абстрактный класс (когда пробовал использовать компилер выдал ошибку на 10килобайт ;) ). Ну, а по указателю - как обычно, елементарная схема хранения указателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 12:00 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Анатолий Широковиспользуйте boost::shared_ptr Ну, про это я уже сказал чуть выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 12:07 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
AkhЭто я понимаю в случае с map. Что значит, хранение по ссылке? Ведь в stl же существует какой-то auto_ptr? Это значит, что в контейнере должен храниться переменная типа "указатель на твой класс". auto_ptr НЕ МОЖЕТ храниться в контейнерах STL. Akh Я в принципе интересуюсь структрой классов. Допустим есть класс 2 со звездочкой, который наследуется тоже от класса 1. Обычная схема собаки и кошки от животного. Можно ли как-то изменить схему, для того чтобы map разобрался что в нем хранится? Ну или не map а базовый класс. Или не базовый класс, а что там получиться. Только без всяких смарт-поинтеров (это опять же указатели). Т.е. что-то типа протаскивание виртуальной таблицы от созданного класса, в класс, который скопирует себе map? ЧЁ ? Сам понял, что сказал ? Нинадо ничего никуда перетаскивать, надо просто хранить в контейнерах указатели на типы данных. Так уж STL сделан, мать его... Он умеет хранить либо неполиморфные объекты по значению, либо полиморфные по ссылке (неполиморфные тоже можно по ссылке). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 14:12 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
MasterZiv auto_ptr НЕ МОЖЕТ храниться в контейнерах STL. Так уж STL сделан, мать его... Он умеет хранить либо неполиморфные объекты по значению, либо полиморфные по ссылке (неполиморфные тоже можно по ссылке). Действительно, map в себя auto_ptr не пускает. Что он имеет такого особенного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 15:50 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Действительно, map в себя auto_ptr не пускает. Что он имеет такого особенного? закрытый конструктор копирования это логично, т.к. используется реализация разрушающего копирования для контейнеров нужно что-то вроде упомянутого boost::shared_ptr, там используется счетчик ссылок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 15:59 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Голенков Владимирзакрытый конструктор копирования Наверное, я что-то не так понимаю. Это компилится: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 16:11 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Есплицитный конструктор только пустой. По идее map должен вызывать конструктор копирования... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 16:43 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Ошибка возникает следующая: автор ... /usr/include/c++/3.3.3/bits/stl_pair.h:88: error: passing `const APtr' as `this' argument of `std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = A, _Tp = A]' discards qualifiers на Код: plaintext 1. Никак не пойму, что ему не понравилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 16:46 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
по-видимому, не нравится const ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 16:51 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
И куда он его хочет запихнуть? И что за оператор такой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 16:55 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
а вот так нет Код: plaintext 1. 2. 3. 4. там нет копирующего конструктора для const ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 17:06 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Это конструктор копирования класса pair. Код: plaintext 1. 2. 3. Идее вызывается конструктор копирования auto_ptr: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Ничего страшного не вижу. В realase() тоже. И ошибка какая-то непонятная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 17:07 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
Голенков Владимиртам нет копирующего конструктора для const Так значит, если я объявлю копирующий конструктор для своего класса. То с мои const объекты копироваться не будут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 17:09 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
и еще выдержка из <memory> auto_ptr does not meet the CopyConstructible and Assignable requirements for Standard Library container elements and thus instantiating a Standard Library container with an auto_ptr results in undefined behavior ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 17:09 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
так он не на пару тебе гурается, а на ap, а make_pair ты так и не привёл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 17:28 |
|
||
|
map, virtual
|
|||
|---|---|---|---|
|
#18+
maXmoтак он не на пару тебе гурается, а на ap, а make_pair ты так и не привёл. Как же не привел? Как я понял, ошибка возникает, когда он пытается скопировать second. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 17:35 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34192698&tid=2029835]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 195ms |
| total: | 469ms |

| 0 / 0 |
