powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / map, virtual
25 сообщений из 29, страница 1 из 2
map, virtual
    #34192456
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс 1, был абстрактный, а пришлось сдеалать просто виртуальным, и класс 2, от него наследуется. Есть map, значение - класс1. Кладу туда класс 2, потом высовываю, получается вызов функций класса 1, виртуальные класса 2 не вызываются. Так понял, что происходит преобразование класса 2 в класс1 когда производилось всовывание в map. Соответсвенно, информация про класс 2 потерялась. Пришлось в map, класть указатель на класс 2, а значением map делать указатель на класс1. Минус - надо возиться с указателями. Есть ли другие решения, как в map, запихнуть класс2?
...
Рейтинг: 0 / 0
map, virtual
    #34192603
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы нарвались на усечение при присваивании.
Полиморфные типы в STLевских классах надо хранить по ссылке, а не по значению ( т.е. хранить указатели на тип в данном конкретном случае, поскольку STL хранение по ссылке не поддерживает).
...
Рейтинг: 0 / 0
map, virtual
    #34192656
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так ты объект прям по значению запихивал???
...
Рейтинг: 0 / 0
map, virtual
    #34192660
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я понимаю в случае с map. Что значит, хранение по ссылке? Ведь в stl же существует какой-то auto_ptr?

Я в принципе интересуюсь структрой классов. Допустим есть класс 2 со звездочкой, который наследуется тоже от класса 1. Обычная схема собаки и кошки от животного. Можно ли как-то изменить схему, для того чтобы map разобрался что в нем хранится? Ну или не map а базовый класс. Или не базовый класс, а что там получиться. Только без всяких смарт-поинтеров (это опять же указатели). Т.е. что-то типа протаскивание виртуальной таблицы от созданного класса, в класс, который скопирует себе map?
...
Рейтинг: 0 / 0
map, virtual
    #34192665
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoтак ты объект прям по значению запихивал???

Вот именно. :) Я же написал - значение класс.
...
Рейтинг: 0 / 0
map, virtual
    #34192669
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используйте boost::shared_ptr
...
Рейтинг: 0 / 0
map, virtual
    #34192698
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полиморфизм поддерживается только на уровне указателей, насколько я помню…
А если базовый класс абстрактный, то всё пашет?
...
Рейтинг: 0 / 0
map, virtual
    #34192711
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoполиморфизм поддерживается только на уровне указателей, насколько я помню…
А если базовый класс абстрактный, то всё пашет?

1. Вот, поэтому я считаю, что моя идеа абсурдна.

2. По значению не может пахать. Так как map не может хранить абстрактный класс (когда пробовал использовать компилер выдал ошибку на 10килобайт ;) ). Ну, а по указателю - как обычно, елементарная схема хранения указателей.
...
Рейтинг: 0 / 0
map, virtual
    #34192735
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широковиспользуйте boost::shared_ptr

Ну, про это я уже сказал чуть выше.
...
Рейтинг: 0 / 0
map, virtual
    #34193321
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhЭто я понимаю в случае с map. Что значит, хранение по ссылке? Ведь в stl же существует какой-то auto_ptr?


Это значит, что в контейнере должен храниться переменная типа "указатель на твой класс".

auto_ptr НЕ МОЖЕТ храниться в контейнерах STL.

Akh
Я в принципе интересуюсь структрой классов. Допустим есть класс 2 со звездочкой, который наследуется тоже от класса 1. Обычная схема собаки и кошки от животного. Можно ли как-то изменить схему, для того чтобы map разобрался что в нем хранится? Ну или не map а базовый класс. Или не базовый класс, а что там получиться. Только без всяких смарт-поинтеров (это опять же указатели). Т.е. что-то типа протаскивание виртуальной таблицы от созданного класса, в класс, который скопирует себе map?

ЧЁ ? Сам понял, что сказал ?

Нинадо ничего никуда перетаскивать, надо просто хранить в контейнерах указатели на типы данных.

Так уж STL сделан, мать его... Он умеет хранить либо неполиморфные объекты по значению, либо полиморфные по ссылке (неполиморфные тоже можно по ссылке).
...
Рейтинг: 0 / 0
map, virtual
    #34193747
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
auto_ptr НЕ МОЖЕТ храниться в контейнерах STL.

Так уж STL сделан, мать его... Он умеет хранить либо неполиморфные объекты по значению, либо полиморфные по ссылке (неполиморфные тоже можно по ссылке).

Действительно, map в себя auto_ptr не пускает. Что он имеет такого особенного?
...
Рейтинг: 0 / 0
map, virtual
    #34193798
Действительно, map в себя auto_ptr не пускает. Что он имеет такого особенного?

закрытый конструктор копирования
это логично, т.к. используется реализация разрушающего копирования

для контейнеров нужно что-то вроде упомянутого boost::shared_ptr, там используется счетчик ссылок
...
Рейтинг: 0 / 0
map, virtual
    #34193865
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимирзакрытый конструктор копирования

Наверное, я что-то не так понимаю. Это компилится:

Код: plaintext
1.
2.
3.
4.
5.
typedef auto_ptr<A> APtr;

APtr pa(new A);
APtr pa2=pa;

...
Рейтинг: 0 / 0
map, virtual
    #34194026
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есплицитный конструктор только пустой. По идее map должен вызывать конструктор копирования...
...
Рейтинг: 0 / 0
map, virtual
    #34194044
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка возникает следующая:
автор
...
/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.
map.insert(make_pair( 5 , ap));

Никак не пойму, что ему не понравилось.
...
Рейтинг: 0 / 0
map, virtual
    #34194068
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по-видимому, не нравится const
...
Рейтинг: 0 / 0
map, virtual
    #34194085
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И куда он его хочет запихнуть? И что за оператор такой?
...
Рейтинг: 0 / 0
map, virtual
    #34194100
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
passing `const APtr'
...
Рейтинг: 0 / 0
map, virtual
    #34194126
а вот так нет

Код: plaintext
1.
2.
3.
4.
typedef auto_ptr<A> APtr;

const APtr pa(new A);
APtr pa2=pa;

там нет копирующего конструктора для const
...
Рейтинг: 0 / 0
map, virtual
    #34194133
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это конструктор копирования класса pair.

Код: plaintext
1.
2.
3.
  /** There is also a templated copy ctor for the @c pair class itself.  */
  template <class _U1, class _U2>
  pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {}

Идее вызывается конструктор копирования auto_ptr:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
      /**
       *  @brief  An %auto_ptr can be constructed from another %auto_ptr.
       *  @param  a  Another %auto_ptr of the same type.
       *
       *  This object now @e owns the object previously owned by @a a,
       *  which has given up ownsership.
       */
      auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }

Ничего страшного не вижу.

В realase() тоже.

И ошибка какая-то непонятная
...
Рейтинг: 0 / 0
map, virtual
    #34194146
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимиртам нет копирующего конструктора для const

Так значит, если я объявлю копирующий конструктор для своего класса. То с мои const объекты копироваться не будут?
...
Рейтинг: 0 / 0
map, virtual
    #34194153
и еще выдержка из <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
...
Рейтинг: 0 / 0
map, virtual
    #34194232
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так он не на пару тебе гурается, а на ap, а make_pair ты так и не привёл.
...
Рейтинг: 0 / 0
map, virtual
    #34194259
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoтак он не на пару тебе гурается, а на ap, а make_pair ты так и не привёл.

Как же не привел? Как я понял, ошибка возникает, когда он пытается скопировать second.
...
Рейтинг: 0 / 0
map, virtual
    #34194266
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итог такой: в контейнерах stl нельзя испольовать объекты, которые при копировании изменяют свойства исходных. Исключения состаляют, в которых изменяемые свойства замутаблены.

Если не прав, то поправте.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / map, virtual
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]