![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Есть один вопрос, допустим есть какой-нибудь контейнер, пусть даже smart pointer
вопрос в том, как можно реализовать operator=, чтобы можно было присваивать объекту класса container<T> объект класса container<C> в случае если класс C - реализация интерфейса T или просто T - открытый базовый класс для C. Вообщем надо каким-то образом получить pointer типа C* из object в примере выше. Сложность в том, что нельзя пользоваться оператором преобразования template<class P> operator container<P>() {...}, ввиду его неявного применения там, где это не нужно -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
MAKCim
а чем не устраивает?
|
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Ты собираешься нарушить семантику присваивания, на мой взгляд.
Где ты видел, чтобы типы аргументов оператора присваивания различались? |
|||
|
||||
Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Хе. это иногда бывает полезно ![]()
|
||||
|
|||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Ну ладно. Тогда к твоему p = pointer.p надо добавить еще освобождение правого аргумента, в смысле ему какой-нибудь null присвоить.
Это сообщение отредактировал(а) Hroft - 9.2.2006, 19:57 |
|||
|
||||
Lotrex |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
По-моему, лучше сделать так:
Я умышленно в списке пр-ров написал container<T> а не container<С> Если преобразование типов будет допустимо, то тип параметра object или при вызове преобразуется автоматически, или преобразование можно явно при вызове указать... |
||||||
|
|||||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Lotrex
Это: p = new T накладывает ограничение на класс T, т.е. наличие открытого конструктора по умолчанию, что может быть не очень удобно если его нет, тогда использовать этот контейнер с таким классом нельзя. Ещё то, что это лишние операции, которые в принципе могут быть не нужны и могут повлеч за собой падение производительности. Хотя, конечно, всё зависит от реализации контейнера и клиентских классов... |
|||
|
||||
Lotrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Может, тогда вот так:
Вообще-то, если p - указатель, и мы не хотим поиметь проблем, то без new тут никак не обойтись. |
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
А что ты изменил? Предполагается все равно наличие public конструктора без параметров. И почему проблемы? Наша цель - уничтожить объект только когда он не нужен, и не раньше.
|
|||
|
||||
Lotrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Даже нет, без typeid:
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Lotrex
![]() ![]() ![]() Это всё не имеет смысла, поскольку мы не знаем поведение класса container и деталей его реализации. |
|||
|
||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Силу метапрограммирования использовать можно.
А вспомогательеые классы это что-то типа этого:
зы. проверено гнус4 и комом Это сообщение отредактировал(а) Mayk - 9.2.2006, 20:30 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
дело в том, что
не скомпилируется по понятным причинам (shadows template parm 'class T') (gcc 4.0) Daevaorn
написать object.p нельзя т.к container<C> и container<T> разные типы, причем p находится в private секции, т е из container<T> нет доступа к container<C>: ![]() Добавлено @ 20:41 Mayk а если у нас нет
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
Lotrex |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Если сделать так:
и p - это указатель, мы скопируем тока значение указателя, а не данные, на которые он указывает(а надо бы совсем наоборот - данные скопировать в другую область памяти). Вот простенький примерчик(ничего, если там нужны конструкторы по умолчанию? ![]()
|
||||||
|
|||||||
MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Mayk
думаю тут можно и не использовать проверку на конвертируемость, т. к
компилятор выдаст ошибку на этапе компиляции если C* не преобразуется в T* -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |